sábado, 22 de octubre de 2011

Ordernar, filtrar y pagineo (MVC)

6 comentarios:
Para este ejemplo usaremos la tabla products de la base de datos northwind y ya debemos de tener su controlador y las vistas del mismo.  (Ver ejemplo anterior)

Código inicial del contraldor:

public ViewResult Index() 
{ 
    var products = db.Products.Include(p => p.Categories).Include(p => p.Suppliers);
    return View(products.ToList()); 
}
Código inicial de la vista:
<table> 
    <tr> 
        <th> 
            ProductName 
        </th> 
        <th> 
            Suppliers 
        </th> 
        <th> 
            Categories 
        </th> 
        <th> 
            UnitPrice 
        </th> 
        <th> 
            UnitsInStock 
        </th> 
        <th> 
            Discontinued 
        </th> 
        <th></th> 
    </tr>
Sort:
En este ejemplo agregaremos al controlador.

public ViewResult Index(string sortOrder)
{ 
  ViewBag.NameSortParm = String.IsNullOrEmpty(sortOrder) ? "ProductName desc" : ""; 
  ViewBag.UnitPriceSortParm = sortOrder == "UnitPrice" ? "UnitPrice desc" : "UnitPrice"; 

  var products = db.Products.Include(p => p.Categories).Include(p => p.Suppliers);

   switch (sortOrder) 
   { 
   case "ProductName desc": 
       products = products.OrderByDescending(s => s.ProductName); 
       break; 
   case "UnitPrice": 
       products = products.OrderBy(s => s.UnitPrice); 
       break; 
   case "UnitPrice desc": 
        products = products.OrderByDescending(s => s.UnitPrice); 
        break; 
   default: 
        products = products.OrderBy(s => s.ProductName); 
        break; 
    } 
   return View(products.ToList()); 
}


En la vista cambiaremos los header por links los cuales enviaran el orden necesario:


<table> 
    <tr> 
        <th>             
 @Html.ActionLink("Product Name", "Index", new { sortOrder = ViewBag.NameSortParm }) 
        </th> 
        <th> 
            Suppliers 
        </th> 
        <th> 
            Categories 
        </th> 
        <th> 
@Html.ActionLink("UnitPrice", "Index", new { sortOrder = ViewBag.UnitPriceSortParm }) 
        </th> 
        <th> 
            UnitsInStock 
        </th> 
        <th> 
            Discontinued 
        </th> 
        <th></th> 
    </tr>

Resultado:



Filtros:
En este ejemplo agregaremos al controlador.


public ViewResult Index(string sortOrder, string searchString)
{ 
  ViewBag.NameSortParm = String.IsNullOrEmpty(sortOrder) ? "ProductName desc" : ""; 
  ViewBag.UnitPriceSortParm = sortOrder == "UnitPrice" ? "UnitPrice desc" : "UnitPrice"; 
  
  ViewBag.SearchString = searchString;
  var products = db.Products.Include(p => p.Categories).Include(p => p.Suppliers);

if (!String.IsNullOrEmpty(searchString)) 
{ 
  products = products.Where(s => s.ProductName.ToUpper().Contains(searchString.ToUpper()));
                                        
} 

   switch (sortOrder) 
   { 
   case "ProductName desc": 
       products = products.OrderByDescending(s => s.ProductName); 
       break; 
   case "UnitPrice": 
       products = products.OrderBy(s => s.UnitPrice); 
       break; 
   case "UnitPrice desc": 
        products = products.OrderByDescending(s => s.UnitPrice); 
        break; 
   default: 
        products = products.OrderBy(s => s.ProductName); 
        break; 
    } 
   return View(products.ToList()); 
}



En la vista agregaremos un textbox necesario para buscar los productos:

<p> 
    @Html.ActionLink("Create New", "Create") 

    @using (Html.BeginForm()) 
    { 
        <p> 
            Product Name: @Html.TextBox("SearchString") &nbsp; 
            <input type="submit" value="Search" /></p> 
    } 

</p>

En la vista también debemos de cambiar los action link para conservar el valor del searchString.

 @Html.ActionLink("Product Name", "Index", new { sortOrder = ViewBag.NameSortParm, 
                SearchString = ViewBag.SearchString }) 

@Html.ActionLink("UnitPrice", "Index", new { sortOrder = ViewBag.UnitPriceSortParm,                     SearchString = ViewBag.SearchString })


Resultado:



Pagineo:
Antes que nada tenemos que instalar : PagedList NuGet Package.


  1. Menu Tools
  2. Library Package Manager
  3. Add Library Package Reference
  4. Clic en online en la parte izquierda
  5. Luego en buscar escriba PagedList
  6. Por ultimo instale el paquete.
Se agrega la libreria el siguiente using:

using PagedList;

Código del controlador:

public ViewResult Index(string sortOrder, string currentFilter,
string searchString, int? page) 
{ 
    ViewBag.CurrentSort = sortOrder; 
    ViewBag.NameSortParm = String.IsNullOrEmpty(sortOrder) ? "ProductName desc" : ""; 
    ViewBag.UnitPriceSortParm = sortOrder == "UnitPrice" ? "UnitPrice desc" : "UnitPrice"

    ViewBag.SearchString = searchString;

    if (Request.HttpMethod == "GET") 
    { 
        searchString = currentFilter; 
    } 
    else 
    { 
        page = 1; 
    } 
    ViewBag.CurrentFilter = searchString; 

    var products = db.Products.Include(p => p.Categories).Include(p => p.Suppliers); 

    if (!String.IsNullOrEmpty(searchString)) 
    { 
 products = products.Where(s => s.ProductName.ToUpper().Contains(searchString.ToUpper()));
                                        
    } 

    switch (sortOrder) 
    { 
        case "ProductName desc": 
            products = products.OrderByDescending(s => s.ProductName); 
            break; 
        case "UnitPrice":
            products = products.OrderBy(s => s.UnitPrice); 
            break; 
        case "UnitPrice desc": 
            products = products.OrderByDescending(s => s.UnitPrice); 
            break; 
        default: 
            products = products.OrderBy(s => s.ProductName); 
            break; 
    } 

    int pageSize = 10; 
    int pageIndex = (page ?? 1);
    return View(products.ToPagedList(pageIndex, pageSize)); 
}

Código de la vista:
Debemos de cambiar el model:

@model PagedList.IPagedList<Northwind.Models.Products>

Agregar el siguiente código al final de la tabla:

<div> 
    Page @(Model.PageCount < Model.PageNumber ? 0 : Model.PageNumber)
    of @Model.PageCount 
    &nbsp; 
    @if (Model.HasPreviousPage) 
    { 
        @Html.ActionLink("<<", "Index", new { page = 1, 
sortOrder = ViewBag.CurrentSort,
currentFilter = ViewBag.CurrentFilter, 
SearchString = ViewBag.SearchString })

        @Html.Raw("&nbsp;"); 
        @Html.ActionLink("< Prev", "Index", new { page = Model.PageNumber - 1,
sortOrder = ViewBag.CurrentSort, currentFilter = ViewBag.CurrentFilter, 
SearchString = ViewBag.SearchString })
    } 
    else 
    { 
        @:<< 
        @Html.Raw("&nbsp;"); 
        @:< Prev 
    } 
    &nbsp; 
    @if (Model.HasNextPage) 
    { 
        @Html.ActionLink("Next >", "Index", new {      page = Model.PageNumber + 1,
sortOrder = ViewBag.CurrentSort, currentFilter = ViewBag.CurrentFilter, 
SearchString = ViewBag.SearchString })

        @Html.Raw("&nbsp;"); 
        @Html.ActionLink(">>", "Index", new { page = Model.PageCount,
sortOrder = ViewBag.CurrentSort, currentFilter = ViewBag.CurrentFilter, 
SearchString = ViewBag.SearchString })
    } 
    else 
    { 
        @:Next > 
        @Html.Raw("&nbsp;") 
        @:>> 
    } 
</div>


Resultado:








Ver

sábado, 15 de octubre de 2011

Introduction MVC (Modelos)

No hay comentarios.:
El tema de hoy son los Modelos. Los objetos de modelo son las partes de la aplicación que implementan la lógica del dominio de datos de la aplicación. A menudo, los objetos de modelo recuperan y almacenan el estado del modelo en una base de datos. Por ejemplo, un objeto Product podría recuperar información de una base de datos, trabajar con ella y, a continuación, escribir la información actualizada en una tabla Productos de una base de datos de SQL Server

En el siguiente ejemplo nos conectaremos a la base datos Northwind la cual es requerida:

1.) Crear un nuevo proyecto - File - New proyect - ASP.Net MVC 3 Web Applicacion


Name: Northwind





2.)Elegir el tipo de proyecto MVC - Internet Applicacion- View engine- Razor



3.) Crear los Modelos


3.1) Categorias
En la carpeta de Models cree un nuevo archivo ( clic derecho nueva clase) en esta clase solo definiremos los campos que nos interesan, los otros los ignoraremos, note que hemos definido la llave primaria necesaria para los contextos.


using System;
using System.Collections.Generic; 
using System.ComponentModel.DataAnnotations;  

namespace Northwind.Models 
{ 
    public class Categories
    { 
        [Key] 
        public int CategoryID { get; set; }
        public string CategoryName { get; set; }
        public virtual ICollection<Products> Products { get; set; }
         
    } 
} 




3.2) Productos
En la carpeta de Models cree un nuevo archivo ( clic derecho nueva clase) en esta clase No solo hemos definido los campos, si no que también, tenemos otras definiciones:


Display :  Etiqueta que acompañara al campo.
Required: Campo de llenado obligatorio, se pude definir mensaje.
Maxlength: Maximo de caracteres.
DisplayFormat: Formato de mostrar útil para campos de numéricos o fecha.


using System; 
using System.Collections.Generic; 
using System.ComponentModel.DataAnnotations;  

namespace Northwind.Models 
{ 
    public class Products 
    { 
        [Key] 
        public int ProductID { get; set; }

        [Display(Name = "Nombre")] 
        [Required(ErrorMessage = "Nombre de Producto Requerido")] 
        [MaxLength(50)] 
        public string ProductName { get; set; }

        [Display(Name = "Proveedor")] 
        public int SupplierID { get; set; }
         
        [Display(Name = "Categoria")] 
        public int CategoryID { get; set; }

        [Display(Name = "Precio")] 
        [DisplayFormat(DataFormatString = "{0:c}")] 
        [Column(TypeName = "money")]  
        public decimal UnitPrice { get; set; }

         [Display(Name = "Disponibles")] 
        public Int16 UnitsInStock { get; set; }

         [Display(Name = "Descontinuado")] 
        public bool Discontinued { get; set; }

        public virtual Categories Categories { get; set; }
    } 
} 






3.3) Contexto


En la carpeta de Models cree un nuevo archivo ( clic derecho nueva clase) en esta clase se creara el contexto que se encargara de vincular nuestros modelos con nuestras tablas.


using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.Mvc; 
using Northwind.Models;  
using System.Data.Entity.ModelConfiguration.Conventions; 
using System.Data.Entity;  



namespace Northwind.Models 
{ 
    public class NorthwindContex : DbContext
    { 
       
        public DbSet<Categories> Categories { get; set; }
        public DbSet<Products> Products { get; set; }

    } 
}






3.4) Configurar conexión a base de datos
Abra el web config y agregue la siguiente linea, la cual nos proporcionara la conexión con la base de datos (El connectionStrings esta puesto solo como referencia lo mas seguro es que ya este en su web config):


<connectionStrings> 
    <add name="NorthwindContex" 
   connectionString="data source=localhost;
   initial catalog=northwind;persist security info=True; 
   user id=sa;password=P@ssw0rd" 
   providerName="System.Data.SqlClient" /> 
  </connectionStrings> 


4.) Ahora crearemos el controlador:
Clic derecho sobre la carpeta controller 


Luego aparecerá una ventana la cual la tenemos que llenar con lo siguiente:



Controller name: ProducsController.
Template: Controller with read/write actions and views, using Entity Framework.
Model class: Student (Northwind.Models). (Si no esta compile el proyecto)
Data context class: NorthwindContext (Northwind.Models).
    Views: Razor (CSHTML).




5.) Modificando el Menu.


Para esto cambiaremos la vista Layout la cual se encuentra bajo la carpeta view y luego share, Agregaremos la llamada a nuestras vistas generadas:




  • @Html.ActionLink("Products", "Index", "Products")



  • 6.) Finalmente como debe quedar nuestro ejemplo, al presionar nuevo, podremos ver mucha funcionalidad como validaciones nombre de los campos, etc.



    Ver

    domingo, 9 de octubre de 2011

    Seguridad en MVC 3 (Membership)

    No hay comentarios.:
    Este Utilizaremos membership para la seguridad de nuestro sitio.

    1.) Cree un proyecto MVC  


    1.1)File- New project


    1.2) Seleccione Internet Aplicación -Razor - Html5




    2.) Ejecutamos el asistente membership.


    Navegue en la siguiente ruta:

    C:\Windows\Microsoft.NET\Framework\v4.0.30319

    Ejecute
     aspnet_regsql.exe

    El siguiente wizard se mostrara

    1.) Elija configure sql server for application service, seleccione la base datos que utilizara, finalice el wizard.




    3.) Configuramos el web config de nuestro sitio para que utilice membership.

    3.1) Abra el web config y configure  el ApplicationServices con la información de su servidor de sql server en el connectionStrings.

      <connectionStrings> 
        <add name="ApplicationServices"
        connectionString="data source=xp;user id=sa;password=123;initial catalog=northwind"         providerName="System.Data.SqlClient" /> 
      </connectionStrings>

    4.) Configurar la seguridad con  Web Site Administration Tool

    4.1) En el Soluction explorer  presioné clic en el web site administrattion tool


    4.1) Ingrese en el menu Security.

    4.2) Ventana de Security, desde esta pantalla crearemos los Usuarios y roles.


    4.3) Crearemos 2 Usuarios, User1 y User2, para realizar las pruebas.

    4.4) Habilitaremos los roles, presionando clic en el boton habilitar role.

    4.5) Crearemos un role de administrador



    4.6) Agregaremos al user1 al role de administrador, en la ventana de security clic en manage Users y agregar a administrador a user1.



    5.) Aplicar la seguridad en el sitio. para realizar pruebas, aplicaremos la seguridad al controlador Home.

    5.1) Aplicando seguridad al Accion About.

    5.1.1) Abra el Controlador: HomeController

    Para agregar seguridad tenemos 3 opciones:

      [Authorize] 
            public ActionResult About() 
            { 
                return View(); 
            } 
    
    [Authorize(Roles = "administrador")] 
            public ActionResult About() 
            { 
                return View(); 
            } 
    
    [Authorize(Users="user1")] 
            public ActionResult About() 
            { 
                return View(); 
            }

    Authorize: Permitira entrar solo Usuarios ya autenticados.
    Authorize Roles: Solo los roles que ingrese ejemplo: Administrador
    Authorize Users: Solo los usuarios que ingrese ejemplo: User1


    6.) Ahora realizar nuestro test, Probado con cada una de las opciones de seguridad.
    Ver

    jueves, 6 de octubre de 2011

    Steve jobs Icloud

    No hay comentarios.:
    @Dios: @Jobs Se le solicita en mi #oficina.

    Yo tengo una app para eso!








    Ver

    Discurso de Steve Jobs en la Universidad de Stanford

    No hay comentarios.:


    Tengo el honor de estar hoy aquí con vosotros en vuestro comienzo en una de las mejores universidades del mundo. La verdad sea dicha, yo nunca me gradué.

    A decir verdad, esto es lo más cerca que jamás he estado de una graduación universitaria.

    Hoy les quiero contar tres historias de mi vida. Nada especial. Sólo tres historias.
    La primera historia versa sobre "conectar los puntos".

    Dejé la Universidad de Reed tras los seis primeros meses, pero después seguí vagando por allí otros 18 meses, más o menos, antes de dejarlo del todo. Entonces, ¿por qué lo dejé?

    Comenzó antes de que yo naciera.

    Mi madre biológica era una estudiante joven y soltera, y decidió darme en adopción. Ella tenía muy claro que quienes me adoptaran tendrían que ser titulados universitarios, de modo que todo se preparó para que fuese adoptado al nacer por un abogado y su mujer.

    Solo que cuando yo nací decidieron en el último momento que lo que de verdad querían era una niña.

    Así que mis padres, que estaban en lista de espera, recibieron una llamada a medianoche preguntando:

    “Tenemos un niño no esperado; ¿lo queréis?”

    “Por supuesto”, dijeron ellos.


    Mi madre biológica se enteró de que mi madre no tenía titulación universitaria, y que mi padre ni siquiera había terminado el bachillerato, así que se negó a firmar los documentos de adopción. Sólo cedió, meses más tarde, cuando mis padres prometieron que algún día yo iría a la universidad.


    Y 17 años más tarde fui a la universidad. Pero de forma descuidada elegí una universidad que era casi tan cara como Stanford, y todos los ahorros de mis padres, de clase trabajadora, los estaba gastando en mi matrícula.


    Después de seis meses, no le veía propósito alguno. No tenía idea de qué quería hacer con mi vida, y menos aún de cómo la universidad me iba a ayudar a averiguarlo.


    Y me estaba gastando todos los ahorros que mis padres habían conseguido a lo largo de su vida. Así que decidí dejarlo, y confiar en que las cosas saldrían bien.

    En su momento me dio miedo, pero en retrospectiva fue una de las mejores decisiones que nunca haya tomado.

    En el momento en que lo dejé, ya no fui más a las clases obligatorias que no me interesaban y comencé a meterme en las que parecían interesantes. No era idílico. No tenía dormitorio, así que dormía en el suelo de las habitaciones de mis amigos, devolvía botellas de Coca Cola por los 5 céntimos del envase para conseguir dinero para comer, y caminaba más de 10 Km los domingos por la noche para comer bien una vez por semana en el templo de los Hare Krishna.


    Me encantaba.

    Y muchas cosas con las que me fui topando al seguir mi curiosidad e intuición resultaron no tener precio más adelante.

    Os daré un ejemplo.

    En aquella época la Universidad de Reed ofrecía la que quizá fuese la mejor formación en caligrafía del país. En todas partes del campus, todos los póster, todas las etiquetas de todos los cajones, estaban bellamente caligrafiadas a mano.


    Como ya no estaba matriculado y no tenía clases obligatorias, decidí atender al curso de caligrafía para aprender cómo se hacía.


    Aprendí cosas sobre el serif y tipografías sans serif, sobre los espacios variables entre letras, sobre qué hace realmente grande a una gran tipografía.

    Era sutilmente bello, histórica y artísticamente, de una forma que la ciencia no puede capturar, y lo encontré fascinante. Nada de esto tenía ni la más mínima esperanza de aplicación práctica en mi vida. Pero diez años más tarde, cuando estábamos diseñando el primer ordenador Macintosh, todo eso volvió a mí.

    Y diseñamos el Mac con eso en su esencia. Fue el primer ordenador con tipografías bellas. Si nunca me hubiera dejado caer por aquél curso concreto en la universidad, el Mac jamás habría tenido múltiples tipografías, ni caracteres con espaciado proporcional. Y como Windows no hizo más que copiar el Mac, es probable que ningún ordenador personal los tuviera ahora. Si nunca hubiera decidido dejarlo, no habría entrado en esa clase de caligrafía y los ordenadores personales no tendrían la maravillosa tipografía que poseen.


    Por supuesto, era imposible conectar los puntos mirando hacia el futuro cuando estaba en clase, pero fue muy, muy claro al mirar atrás diez años más tarde.

    Lo diré otra vez: no puedes conectar los puntos hacia adelante, sólo puedes hacerlo hacia atrás. Así que tenéis que confiar en que los puntos se conectarán alguna vez en el futuro. Tienes que confiar en algo, tu instinto, el destino, la vida, el karma, lo que sea.

    Esta forma de actuar nunca me ha dejado tirado, y ha marcado la diferencia en mi vida.

    Mi segunda historia es sobre el amor y la pérdida.

    Tuve suerte — supe pronto en mi vida qué era lo que más deseaba hacer. Woz y yo creamos Apple en la cochera de mis padres cuando tenía 20 años. Trabajamos mucho, y en diez años Apple creció de ser sólo nosotros dos a ser una compañía valorada en 2 mil millones de dólares y 4.000 empleados.


    Hacía justo un año que habíamos lanzado nuestra mejor creación — el Macintosh — un año antes, y hacía poco que había cumplido los 30.

    Y me despidieron.

    ¿Cómo te pueden echar de la empresa que tú has creado?

    Bueno, mientras Apple crecía contratamos a alguien que yo creía muy capacitado para llevar la compañía junto a mí, y durante el primer año, más o menos, las cosas fueron bien. Pero luego nuestra perspectiva del futuro comenzó a ser distinta y finalmente nos apartamos completamente. Cuando eso pasó, nuestra Junta Directiva se puso de su parte.

    Así que a los 30 estaba fuera. Y de forma muy notoria.

    Lo que había sido el centro de toda mi vida adulta se había ido y fue devastador.


    Realmente no supe qué hacer durante algunos meses. Sentía que había dado de lado a la anterior generación de emprendedores, que había soltado el testigo en el momento en que me lo pasaban. Me reuní con David Packard [de HP] y Bob Noyce [Intel], e intenté disculparme por haberlo fastidiado tanto. Fue un fracaso muy notorio, e incluso pensé en huir del valle [Silicon Valley].

    Pero algo comenzó a abrirse paso en mí — aún amaba lo que hacía. El resultado de los acontecimientos en Apple no había cambiado eso ni un ápice. Había sido rechazado, pero aún estaba enamorado. Así que decidí comenzar de nuevo.

    No lo vi así entonces, pero resultó ser que el que me echaran de Apple fue lo mejor que jamás me pudo haber pasado.

    Había cambiado el peso del éxito por la ligereza de ser de nuevo un principiante, menos seguro de las cosas. Me liberó para entrar en uno de los periodos más creativos de mi vida. Durante los siguientes cinco años, creé una empresa llamada NeXT, otra llamada Pixar, y me enamoré de una mujer asombrosa que se convertiría después en mi esposa.

    Pixar llegó a crear el primer largometraje animado por ordenador, Toy Story, y es ahora el estudio de animación más exitoso del mundo. En un notable giro de los acontecimientos, Apple compró NeXT, yo regresé a Apple y la tecnología que desarrollamos en NeXT es el corazón del actual renacimiento de Apple. Y Laurene y yo tenemos una maravillosa familia.


    Estoy bastante seguro de que nada de esto habría ocurrido si no me hubieran echado de Apple. Creo que fue una medicina horrible, pero supongo que el paciente la necesitaba. A veces, la vida te da en la cabeza con un ladrillo. No perdáis la fe. Estoy convencido de que la única cosa que me mantuvo en marcha fue mi amor por lo que hacía. Tenéis que encontrar qué es lo que amáis. Y esto vale tanto para vuestro trabajo como para vuestros amantes.

    El trabajo va a llenar gran parte de vuestra vida, y la única forma de estar realmente satisfecho es hacer lo que consideréis un trabajo genial. Y la única forma de tener un trabajo genial es amar lo que hagáis. Si aún no lo habéis encontrado, seguid buscando.

    No os conforméis.

    Como en todo lo que tiene que ver con el corazón, lo sabréis cuando lo hayáis encontrado. Y como en todas las relaciones geniales, las cosas mejoran y mejoran según pasan los años. Así que seguid buscando hasta que lo encontréis.

    No os conforméis.

    Mi tercera historia es sobre la muerte.


    Cuando tenía 17 años, leí una cita que decía algo como: “Si vives cada día como si fuera el último, algún día tendrás razón”. Me marcó, y desde entonces, durante los últimos 33 años, cada mañana me he mirado en el espejo y me he preguntado: “Si hoy fuese el último día de mi vida, ¿querría hacer lo que voy a hacer hoy?” Y si la respuesta era “No” durante demasiados días seguidos, sabía que necesitaba cambiar algo.

    Recordar que voy a morir pronto es la herramienta más importante que haya encontrado para ayudarme a tomar las grandes decisiones de mi vida.

    Porque prácticamente todo, las expectativas de los demás, el orgullo, el miedo al ridículo o al fracaso se desvanece frente a la muerte, dejando sólo lo que es verdaderamente importante.

    Recordar que vas a morir es la mejor forma que conozco de evitar la trampa de pensar que tienes algo que perder. Ya estás desnudo. No hay razón para no seguir tu corazón.

    Hace casi un año me diagnosticaron cáncer.


    Me hicieron un chequeo a las 7:30 de la mañana, y mostraba claramente un tumor en el páncreas. Ni siquiera sabía qué era el páncreas. Los médicos me dijeron que era prácticamente seguro un tipo de cáncer incurable y que mi esperanza de vida sería de tres a seis meses. Mi médico me aconsejó que me fuese a casa y dejara zanjados mis asuntos, forma médica de decir: prepárate a morir.


    Significa intentar decirle a tus hijos en unos pocos meses lo que ibas a decirles en diez años. Significa asegurarte de que todo queda atado y bien atado, para que sea tan fácil como sea posible para tu familia. Significa decir adiós.

    Viví todo un día con ese diagnóstico.

    Luego, a última hora de la tarde, me hicieron una biopsia, metiéndome un endoscopio por la garganta, a través del estómago y el duodeno, pincharon el páncreas con una aguja para obtener algunas células del tumor. Yo estaba sedado, pero mi esposa, que estaba allí, me dijo que cuando vio las células al microscopio el médico comenzó a llorar porque resultó ser una forma muy rara de cáncer pancreático que se puede curar con cirugía.

    Me operaron, y ahora estoy bien. Esto es lo más cerca que he estado de la muerte, y espero que sea lo más cerca que esté de ella durante algunas décadas más. Habiendo vivido esto, ahora os puedo decir esto con más certeza que cuando la muerte era un concepto útil, pero puramente intelectual:


    Nadie quiere morir.

    Ni siquiera la gente que quiere ir al cielo quiere morir para llegar allí. Y sin embargo la muerte es el destino que todos compartimos. Nadie ha escapado de ella. Y así tiene que ser, porque la Muerte es posiblemente el mejor invento de la Vida. Es el agente de cambio de la Vida. Retira lo viejo para hacer sitio a lo nuevo.

    Ahora mismo lo nuevo sois vosotros, pero dentro de no demasiado tiempo, de forma gradual, os iréis convirtiendo en lo viejo, y seréis apartados. Siento ser tan dramático, pero es bastante cierto. Vuestro tiempo es limitado, así que no lo gastéis viviendo la vida de otro.

    No os dejéis atrapar por el dogma que es vivir según los resultados del pensamiento de otros.

    No dejéis que el ruido de las opiniones de los demás ahogue vuestra propia voz interior.

    Y lo más importante, tened el coraje de seguir a vuestro corazón y vuestra intuición.

    De algún modo ellos ya saben lo que tú realmente quieres ser.

    Todo lo demás es secundario.

    Cuando era joven, había una publicación asombrosa llamada The Whole Earth Catalog [Catálogo de toda la Tierra], una de las biblias de mi generación. La creó un tipo llamado Stewart Brand no lejos de aquí, en Menlo Park y la trajo a la vida con su toque poético. Eran los últimos años 60, antes de los ordenadores personales y la autoedición, así que se hacía con máquinas de escribir, tijeras, y cámaras Polaroid. Era como Google con tapas de cartulina, 35 años de que llegara Google, era idealista, y rebosaba de herramientas claras y grandes conceptos. Stewart y su equipo sacaron varios números del The Whole Earth Catalog, y cuando llegó su momento, sacaron un último número.

    Fue a mediados de los 70, y yo tenía vuestra edad.

    En la contraportada de su último número había una fotografía de una carretera por el campo a primera hora de la mañana, la clase de carretera en la que podrías encontrarte haciendo autoestop si sois aventureros. Bajo ella estaban las palabras:

    “Sigue hambriento. Sigue alocado”.

    Era su último mensaje de despedida. Sigue hambriento. Sigue alocado.

    Y siempre he deseado eso para mí. Y ahora, cuando os graduáis para comenzar de nuevo, os deseo eso a vosotros.

    Seguid hambrientos. Seguid alocados.

    Muchísimas gracias a todos.
    Ver

    miércoles, 5 de octubre de 2011

    Linq to dataset en Visual Basic .NET (Option Infer ON)

    No hay comentarios.:
    En este ejemplo siguiente consultaremos un datatable no typed.


    Dim ds As New DataSet()
    
    ' Llena el dataset
    FillDataSet(ds)
    
    Dim orders As DataTable = ds.Tables("customers")
    
    ' Consulta
    
    
    Dim query = _ 
        From c In customers.AsEnumerable() _ 
        Where  c.country = "SPAIN" _ 
        Select New With { _ 
            .id = c.Field(Of String)("Customerid"), _ 
            .city = c.Field(Of String)("city"), _ 
        }
    ' transfiere la información de linq a data table
    Dim boundTable As DataTable = query.CopyToDataTable()
    
    ' Bind del datable al grid
    gridview1.DataSource = boundTable

    Lo interesante es si queremos hacer una consulta sobre la consulta, y queremos que nos habilite el intelligence, tenemos  que agregar la siguiente linea antes de nuestros imports:

    Option Infer On


    Al establecer Option Infer en On, puede declarar las variables locales sin especificar explícitamente un tipo de datos. El compilador deduce el tipo de datos de una variable a partir del tipo de su expresión de inicialización. Ejemplo:



    Dim query2 = _ 
        From c In query2 _     
        Where  c.city = "BARCELONA" _ 
        Select New With { _ 
            c.id, _ 
            c.city , _ 
        }





    Tanto el campo id, como city nos aparecera automáticamente al presionar punto gracias al intellingence.


    http://msdn.microsoft.com/es-ar/library/bb384665.aspx (Option Infer on)
    http://msdn.microsoft.com/es-ar/library/bb386921.aspx#Y566 (LINQ To Datatable)
    Ver