sábado, 31 de enero de 2015

El Libro del Día: Concurrency in C# Cookbook

El Libro del Día: 2015-01-31

Titulo: Concurrency in C# Cookbook
Autor: Stephen Cleary
Editorial: O'Reilly
Nro Paginas: 205

Capítulos:
1. Concurrency: An Overview
2. Async Basics
3. Parallel Basics
4. Dataflow Basics
5. Rx Basics
6. Testing
7. Interop
8. Collections
9. Cancellation
10. Functional-Friendly OOP
11. Synchronization
12. Scheduling
13. Scenarios

Descarga:
Concurrency_in_C#_Cookbook

viernes, 30 de enero de 2015

El Libro del Día: Windows Runtime via C#

El Libro del Día: 2015-01-30

Titulo: Windows Runtime via C#
Autor: Jeffrey Richter, Maarten van de Bospoort
Editorial: Microsoft Press
Nro Paginas: 320

Capítulos:
PART I CORE CONCEPTS
CHAPTER 1 Windows Runtime primer
CHAPTER 2 App packaging and deployment
CHAPTER 3 Process model
PART II CORE WINDOWS FACILITIES
CHAPTER 4 Package data and roaming
CHAPTER 5 Storage files and folders
CHAPTER 6 Stream input and output
CHAPTER 7 Networking
CHAPTER 8 Tile and toast notifications
CHAPTER 9 Background tasks
CHAPTER 10 Sharing data between apps
CHAPTER 11 Windows Store
Appendix: App containers

Descarga:
Windows_Runtime_via_C#

jueves, 29 de enero de 2015

El Libro del Día: Microsoft Visual C# 2013 Step by Step

El Libro del Día: 2015-01-29

Titulo: Microsoft Visual C# 2013 Step by Step
Autor: John Sharp
Editorial: Microsoft Press
Nro Paginas: 824

Capítulos:
Part I INTRODUCING MICROSOFT VISUAL C# AND MICROSOFT VISUAL STUDIO 2013
Chapter 1 Welcome to C#
Chapter 2 Working with variables, operators, and expressions
Chapter 3 Writing methods and applying scope
Chapter 4 Using decision statements
Chapter 5 Using compound assignment and iteration statements
Chapter 6 Managing errors and exceptions
Part II UNDERSTANDING THE C# OBJECT MODEL
Chapter 7 Creating and managing classes and objects
Chapter 8 Understanding values and references
Chapter 9 Creating value types with enumerations and structures
Chapter 10 Using arrays
Chapter 11 Understanding parameter arrays
Chapter 12 Working with inheritance
Chapter 13 Creating interfaces and defining abstract classes
Chapter 14 Using garbage collection and resource management
Part III DEFINING EXTENSIBLE TYPES WITH C#
Chapter 15 Implementing properties to access fields
Chapter 16 Using indexers
Chapter 17 Introducing generics
Chapter 18 Using collections
Chapter 19 Enumerating collections
Chapter 20 Decoupling application logic and handling events
Chapter 21 Querying in-memory data by using query expressions
Chapter 22 Operator overloading
Chapter 23 Improving throughput by using tasks
Chapter 24 Improving response time by performing asynchronous operations
Chapter 25 Implementing the user interface for a Windows Store app
Chapter 26 Displaying and searching for data in a Windows Store app
Chapter 27 Accessing a remote database from a Windows Store app

Descarga:
Microsoft_Visual_C#_2013_Step_by_Step

miércoles, 28 de enero de 2015

El Libro del Día: Microsoft Visual Basic 2013 Step by Step

El Libro del Día: 2015-01-28

Titulo: Microsoft Visual Basic 2013 Step by Step
Autor: Michael Halvorson
Editorial: Microsoft Press
Nro Paginas: 700

Capítulos:
Part I INTRODUCTION TO VISUAL STUDIO DEVELOPMENT
Chapter 1 Visual Basic 2013 development opportunities and the Windows Store
Chapter 2 The Visual Studio Integrated Development Environment
Chapter 3 Creating your first Windows Store application
Chapter 4 Windows desktop apps: A walkthrough using Windows Forms
Part II DESIGNING THE USER INTERFACE
Chapter 5 Working with Windows Store app controls
Chapter 6 Working with Windows Forms controls
Chapter 7 XAML markup step by step
Chapter 8 Using XAML styles
Chapter 9 Exploring Windows 8.1 design features: Command bar, flyout, tiles, and touch
Chapter 10 Creating console applications
Part III VISUAL BASIC PROGRAMMING TECHNIQUES
Chapter 11 Mastering data types, operators, and string processing
Chapter 12 Creative decision structures and loops
Chapter 13 Trapping errors by using structured error handling
Chapter 14 Using arrays, collections, and generics to manage data
Chapter 15 Innovative data management with LINQ
Chapter 16 Object-oriented programming techniques
Part IV DATABASE AND WEB PROGRAMMING
Chapter 17 Database controls for Windows desktop apps
Chapter 18 Data access for Windows Store apps
Chapter 19 Visual Studio web development with ASP.NET
Part V MICROSOFT WINDOWS PHONE PROGRAMMING
Chapter 20 Introduction to Windows Phone 8 development
Chapter 21 Creating your first Windows Phone 8 application

Descarga:
Microsoft_Visual_Basic_2013_Step_by_Step

martes, 27 de enero de 2015

El Libro del Día: Ext JS in Action

El Libro del Día: 2015-01-27

Titulo: Ext JS in Action (Second Edition)
Autor: Jesus Garcia, Grgur Grisogono, Jacob Andresen
Editorial: Manning
Nro Paginas: 408

Capítulos:
PART 1 INTRODUCTION TO EXT JS 4.0
1 A framework apart
2 DOM manipulation
3 Components and containers
PART 2 EXT JS COMPONENTS
4 Core UI components
5 Exploring layouts
6 Forms in Ext JS
7 The data store
8 The grid panel
9 Taking root with trees
10 Drawing and charting
11 Remote method invocation with Ext Direct
12 Drag-and-drop
PART 3 BUILDING AN APPLICATION
13 Class system foundations
14 Building an application

Descarga:
ExtJS_in_Action

lunes, 26 de enero de 2015

El Libro del Día: CoffeeScript in Action

El Libro del Día: 2015-01-26

Titulo: CoffeeScript in Action
Autor: Patrick Lee
Editorial: Manning
Nro Paginas: 432

Capítulos:
PART 1 FOUNDATIONS
1 The road to CoffeeScript 3
2 Simplified syntax 13
3 First-class functions 45
4 Dynamic objects 76
PART 2 COMPOSITION
5 Composing objects 107
6 Composing functions 144
7 Style and semantics 179
8 Metaprogramming 214
9 Composing the asynchronous 241
PART 3 APPLICATIONS
10 Driving with tests 269
11 In the browser 299
12 Modules and builds 321
13 ECMAScript and the future of CoffeeScript

Descarga:
CoffeeScript_in_Action

domingo, 25 de enero de 2015

El Libro del Día: Create Web Charts with D3

El Libro del Día: 2015-01-25

Titulo: Create Web Charts with D3
Autor: Fabio Nelli
Editorial: Apress
Nro Paginas: 301

Capítulos:
Chapter 1: Charting Technology Overview
Chapter 2: Working with D3
Chapter 3: Line Charts with D3
Chapter 4: Bar Charts with D3
Chapter 5: Pie Charts with D3
Chapter 6: Candlestick Charts with D3
Chapter 7: Scatterplot and Bubble Charts with D3
Chapter 8: Radar Charts with D3
Chapter 9: Handling Live Data with D3
Chapter 10: Adding Controls to Charts
Chapter 11: Embedding D3 Charts in jQuery Widgets
Chapter 12: JSON and Layouts - Handling Structured Data
Appendix A: Guidelines for the Examples in the Book

Descarga:
Create_Web_Charts_with_D3

sábado, 24 de enero de 2015

El Libro del Día: Create Web Charts with jqPlot

El Libro del Día: 2015-01-24

Titulo: Create Web Charts with jqPlot
Autor: Fabio Nelli
Editorial: Apress
Nro Paginas: 255

Capítulos:
Chapter 1: Charting Technology Overview
Chapter 2: jQuery Basics
Chapter 3: Introducing jqPlot
Chapter 4: Line Charts with jqPlot
Chapter 5: Bar Charts with jqPlot
Chapter 6: Pie Charts and Donut Charts with jqPlot
Chapter 7: Candlestick Charts with jqPlot
Chapter 8: Scatter Charts and Bubble Charts with jqPlot
Chapter 9: Funnel Charts with jqPlot
Chapter 10: Adding Controls to Charts
Chapter 11: Embedding jqPlot Charts in jQuery Widgets
Chapter 12: Handling Input Data
Appendix A: Guidelines for the Examples in the Book
Appendix B: jqPlot Plug-ins

Descarga:
Create_Web_Charts_with_jqPlot

viernes, 23 de enero de 2015

El Libro del Día: Web Programming with Dart

El Libro del Día: 2015-01-23

Titulo: Web Programming with Dart
Autor: Moises Belchin, Patricia Juberias
Editorial: Apress
Nro Paginas: 446

Capítulos:
Chapter 1: Dart’s Flightpath So Far
Part I: Getting Started
Chapter 2: Setting up Dart Correctly
Part II: Dart Tools
Chapter 3: Making the Most of the Dart Editor
Chapter 4: Using Pub and dart2js to Compile Applications to JavaScript
Chapter 5: Application Launches
Chapter 6: Using the Dart Pub Package Manager
Chapter 7: Optimizing for Dart VM and Dartium
Chapter 8: Cleaning up with Dart Formatter
Chapter 9: Generating Dart Code Documentation
Chapter 10: Monitoring Your Applications with Observatory
Part III: The Dart Language: Basics
Chapter 11: The Dart Comment System
Chapter 12: Understanding Operators and Expressions
Chapter 13: Mastering Dart’s Variables and Data Types
Chapter 14: Flow Control Statements
Chapter 15: Working with Functions
Chapter 16: A Syntax Summary and Cheat Sheet
Part IV: The Dart Language: Advanced
Chapter 17: Processing Exceptions and Error Control
Chapter 18: Understanding Dart Classes
Chapter 19: Implicit Interfaces and Abstract Classes
Chapter 20: Implementing Generics and Typedefs
Chapter 21: Using Dart’s Libraries
Chapter 22: Leveraging Isolates for Concurrency and Multi-Processing
Chapter 23: Asynchronous Programming with Dart
Chapter 24: An Advanced Syntax Summary
Part V: Dart and Other Web Technologies
Chapter 25: Integrating Dart and HTML5
Chapter 26: Integrating Dart and CSS
Part VI: Dart and the Web Server
Chapter 27: Combining Web Services with Dart
Chapter 28: Dart on the Server Side
Part VII: Dart’s Future
Chapter 29: Implementing Design Patterns and Creating Web Components
Chapter 30: Developing a Dart App

Descarga:
Web_Programming_with_Dart

jueves, 22 de enero de 2015

El Libro del Día: Web Standards

El Libro del Día: 2015-01-22

Titulo: Web Standards
Autor: Leslie F. Sikos
Editorial: Apress
Nro Paginas: 510

Capítulos:
Part 1: Web Standards
Chapter 1: Introduction to Web Standards
Chapter 2: Internationalization
Chapter 3: Markup Languages: More Than HTML5
Chapter 4: Serving and Configuration
Chapter 5: Style Sheets
Chapter 6: Scripting and Applications
Chapter 7: Metadata and the Semantic Web
Chapter 8: Web Syndication
Chapter 9: Optimized Appearance
Chapter 10: Accessibility
Part 2: Developing with Standards
Chapter 11: Development Tools
Chapter 12: Putting It All Together
Chapter 13: Best Practices
Chapter 14: Validation
Chapter 15: Most Common Errors

Descarga:
Web_Standards

miércoles, 21 de enero de 2015

Entrenamiento - Cuarto Seminario de .NET (Creación de Controles en ASP.NET)

Cuarto Seminario de .NET: Creación de Librerías de Controles en ASP.NET

Un saludo cordial a todos los visitantes del Blog y anunciar que este Miércoles 28 de Enero tendremos el cuarto y último seminario de .NET, que en esta ocasión tratará sobre como crear Librerías de Controles en ASP.NET, tanto en WebForms como en MVC.

Muchos desarrolladores de WebForms solo crean Controles de Usuario (User Controls) que solo son reusables dentro de una aplicación web, pero si lo quieren usar en otras aplicaciones tienen que copiar el código fuente y eso no es reusabilidad, lo correcto es crear su Librería de Controles Web que contengan clases WebControls o CompositeControls.

Lo mismo sucede en MVC, si queremos trabajar con grillas, gráficos, reportes, Microsoft solo ofrece los controles HTML Helpers que son limitados, por lo cual, muchos programadores recurren a librerías de terceros como jQueryUI, KendoUI, Infragistics, DevExpress, etc. También veremos como podemos aumentar controles a los HTML Helpers de MVC.

Les dejo la propaganda a los interesados:



También publico una foto de la tercera charla sobre Reflection y Creación de Controles WinForms.



No se olviden confirmar su asistencia mediante un mail a Luis.duenash@gmail.com e informes@hte.com.pe.

Los dejo con una frase para que reflexionen: "La grandeza de un país se ve por la cantidad de gente culta que en el habita". Si queremos ser un país desarrollado o del primer mundo, necesitamos invertir mas tiempo en nuestra profesión y cultura; no solo hay que ir a trabajar y cumplir con lo que uno puede, sino, hay que hacer el mejor trabajo (como nadie lo haría) y para eso hay que invertir en nuestro conocimiento.

El Libro del Día: Realtime Web Apps

El Libro del Día: 2015-01-21

Titulo: Realtime Web Apps
Autor: Jason Lengstorf, Phil Leggetter
Editorial: Apress
Nro Paginas: 299

Capítulos:
Part I: Getting Familiar with the Required Technologies
Chapter 1: What Is Realtime
Chapter 2: The Tools
Chapter 3: Pusher
Part II: Planning the App
Chapter 4: Choosing Web Apps Over Native Apps
Chapter 5: Determining the App’s Functionality and Structure
Part III: Building the Basics
Chapter 6: Designing the App
Chapter 7: Creating HTML and CSS Markup
Chapter 8: Building the Back End: Part 1
Chapter 9: Building the Back-End: Part 2
Chapter 10: Implementing Realtime Events and jQuery Effects
Appendix A: OAuth

Descarga:
Realtime_Web_Apps

martes, 20 de enero de 2015

El Demo del Día: TreeView con CheckBox en ASP.NET MVC

TreeView con CheckBox en ASP.NET MVC

Introducción a ASP.NET MVC

El Modelo Vista Controlador es un Modelo o Patrón de Arquitectura de Desarrollo de Software que permite la separación de la lógica en 3 componentes:
- El Modelo: Contiene la lógica del dominio, como las entidades del negocio.
- La Vista: Representa la interface de usuario de la aplicación, por ejemplo las páginas y controles.
- El Controlador: Controla la interacción del usuario con la vista y la asocia a un modelo.

ASP.NET MVC es la implementación de Microsoft de este modelo o patrón como alternativa a los WebForms de ASP.NET, el cual presenta las siguientes ventajas:
- Facilita la administración de la complejidad al separar la lógica en 3 componentes.
- Reduce el HTML enviado al cliente al no usar el estado de vista (ViewState)
- Proporciona una mayor compatibilidad con el desarrollo basado en pruebas (TDD), etc.

A partir de ASP.NET MVC 3 podemos elegir crear las vistas usando 2 motores:
- WebForm: Es el mismo que se usa para crear los Sitios ASP.NET con WebForms, es decir para el código incrustado del servidor se usa: <%= %>, <%: %> o <%# %>.
- Razor: Es un nuevo motor creado especialmente para aplicaciones MVC y usa código incrustado del servidor mediante @.
Nota: Se recomienda usar Razor como motor de vista predeterminado, ya que su sintaxis es mas corta y maneja mejor el tema de codificación y de-codificación.

Para los que recién inician con ASP.NET MVC el inconveniente principal aparte de acostumbrarse al nuevo modelo, es la falta de variedad de controles para crear las vistas, ya que los controles que ofrece Microsoft son los Helpers (no son muchos) que se clasifican en 3:
- HTML Helpers: Form, Label, TextBox, CheckBox, ListBox, DropDownList, ActionLink, etc.
- AJAX Helpers: Form, ActionLink, RouteLink y Script.
- URL Helpers: Action, Content, Encode, HttpRouteUrl.

Quizás los controles que mas extrañen los programadores es los enlazados a datos como GridView, DataList, Repeater, ListView, TreeView, Chart, etc. Aunque si bien es cierto no vienen como Helpers se pueden implementar en forma personalizada, por ejemplo en este primer post de MVC trataremos sobre como crear un TreeView con CheckBox.

Requerimiento

Se desea mostrar una lista de empleados en forma jerárquica de acuerdo a su cargo, para lo cual cada empleado tiene un único jefe. La aplicación debe permitir seleccionar un empleado y automáticamente deberá seleccionarse todos sus dependientes.
Nota: La aplicación debe ser Web y estar en ASP.NET MVC4.

Solución

Para cubrir estos requerimientos se creará un TreeView con CheckBox para lo cual se realizará lo siguiente:
- El el Modelo se creará una Entidad llamada "beEmpleado".
- En el Controlador se creará un método "obtenerEmpleados" que llene una lista con los empleados.
- En el Controlador se creará un método de acción llamado "Lista" que devuelva una vista (ViewResult).
- En el Controlador se creará un método de acción llamado "Listar" que devuelva la lista en formato JSON (JsonResult).
- Desde la Vista "Lista", al cargar la página usando jQuery Ajax se llamará al método "Listar" que devuelve los datos como JavaScript Object Notation (JSON).
- Mediante JavaScript mostraremos los datos en una Tabla
- Mediante jQuery mostraremos los datos en un div creando una lista con viñetas (ul - li) conteniendo CheckBoxs.
- Usando jQuery se programará la selección jerárquica, es decir al marcar o desmarcar un empleado, debe expandirse a todos sus subordinados.
- Usando jQuery se programará el expandir o colapsar un nodo (empleado) del TreeView.

Crear una Aplicación Web de ASP.NET MVC4 en C#

Abrir el Visual Studio 2012 y seleccionar un nuevo proyecto de tipo: "Aplicación web de ASP.NET MVC4", tal como se muestra en la siguiente figura:


Se mostrará una ventana para seleccionar la plantilla de proyecto, similar a la mostrada en la siguiente figura:


Seleccionar la opción "Vacio" y como motor de vista "Razor" y "Aceptar". En la ventana del Explorador de Soluciones se verá la siguiente estructura de carpetas:


Nota: Apreciar como viene predefinida las carpetas para los Controladores, los Modelos y las Vistas.
Además viene una carpeta App_Start para configurar los inicios de la aplicación.

Crear un Modelo con la Entidad del Empleado

Clic derecho a la carpeta Models y seleccionar "Agregar" y luego "Clase", llamarle al archivo "beEmpleado.cs" y escribir el siguiente código:

namespace TreeView_CheckBox.Models
{
    public class beEmpleado
    {
        public int IdEmpleado { get; set; }
        public string Nombres { get; set; }
        public int IdJefe { get; set; }
    }
}

Crear un Controlador para el Empleado

Clic derecho a la carpeta Controllers y seleccionar "Agregar" y luego "Controlador" y se mostrará una ventana similar a la siguiente figura:


Llamarle al archivo "EmpleadoController.cs" y en opciones de plantillas dejarlo en plantilla vacia (Vaciar Controlador MVC). Luego escribir el siguiente código:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using TreeView_CheckBox.Models;

namespace TreeView_CheckBox.Controllers
{
    public class EmpleadoController : Controller
    {
        List<beEmpleado> lbeEmpleado;

        private void obtenerEmpleados()
        {
            lbeEmpleado = new List<beEmpleado>();
            lbeEmpleado.Add(new beEmpleado { IdEmpleado = 1, Nombres = "Luis Dueñas",
                                          IdJefe = 0 });
            lbeEmpleado.Add(new beEmpleado { IdEmpleado = 2, Nombres = "Arturo Castañeda",
                                          IdJefe = 1 });
            lbeEmpleado.Add(new beEmpleado { IdEmpleado = 3, Nombres = "Enrique Espinal",
                                          IdJefe = 1 });
            lbeEmpleado.Add(new beEmpleado { IdEmpleado = 4, Nombres = "Maria Rojas",
                                          IdJefe = 2 });
            lbeEmpleado.Add(new beEmpleado { IdEmpleado = 5, Nombres = "Juan Perez",
                                          IdJefe = 2 });
            lbeEmpleado.Add(new beEmpleado { IdEmpleado = 6, Nombres = "Rosa Toro",
                                          IdJefe = 3 });
            lbeEmpleado.Add(new beEmpleado { IdEmpleado = 7, Nombres = "Pedro Vasquez",
                                          IdJefe = 3 });
            lbeEmpleado.Add(new beEmpleado { IdEmpleado = 8, Nombres = "Cesar Ramirez",
                                          IdJefe = 5 });
            lbeEmpleado.Add(new beEmpleado { IdEmpleado = 9, Nombres = "Ana Rodriguez",
                                          IdJefe = 6 });
        }

        public ViewResult Lista()
        {
            return View();
        }

        public JsonResult Listar()
        {
            JsonResult rpta;
            obtenerEmpleados();
            rpta = Json(lbeEmpleado, JsonRequestBehavior.AllowGet);
            return rpta;
        }
    }
}

Crear una Hoja de Estilos para la Vista

Primero crear una carpeta llamada "Content", luego clic derecho "Agregar" y luego "Hoja de estilos" y como nombre llamarle "ACME.css" y escribir el siguiente código:

body {
    background-color:lightgray;
}
.Titulo {
    background-color:black;
    color:white;
    font-size:x-large;
    text-transform:uppercase;
}
.Subtitulo {
    background-color:white;
    color:black;
    font-size:large;
    text-transform:capitalize;
}
.AnchoTotal {
    width:100%;
}
.FilaCabecera {
    background-color:gray;
    color:white;
}
.FilaDatos {
    background-color:white;
    color:blue;
}

Crear la Vista para mostrar los datos

Ir al controlador y ubicarse sobre el método "Lista" (acción), clic derecho y seleccionar "Agregar vista", aparecerá un diálogo como se muestra en la siguiente figura:


Desmarcar todas las casillas (checkboxs) y agregar la vista llamada "Lista", luego escribir el siguiente código:

@{
    Layout = null;
}
<!DOCTYPE html>
<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>Lista</title>
    <link href="~/Content/ACME.css" rel="stylesheet" />
    <link href="~/Content/TreeView.css" rel="stylesheet" />
</head>
<body>
    <div>
        <table class="AnchoTotal">
            <tr class="Titulo">
                <td colspan="2">TreeView con CheckBox en ASP.NET MVC usando
                                             JSON, jQuery y Ajax</td>
            </tr>
            <tr class="Subtitulo">
                <td colspan="2">Lista de Empleados</td>
            </tr>
            <tr>
                <td style="width:50%">
                    <table class="AnchoTotal">
                        <thead>
                            <tr class="FilaCabecera">
                                <td style="width:100px">Id Emp</td>                        
                                <td style="width:300px">Nombres</td>
                                <td style="width:100px">Id Jefe</td>
                            </tr>
                        </thead>
                        <tbody id="tblEmpleado">
                        </tbody>
                    </table>
                </td>
                <td style="width:50%; vertical-align:top">
                    <div id="divEmpleado">
                        <ul id="ulEmpleado"></ul>
                    </div>
                </td>
            </tr>
        </table>
    </div>
    <script src="~/Scripts/jquery-1.8.2.min.js"></script>
    <script src="~/Scripts/jquery.unobtrusive-ajax.min.js"></script>
    <script src="~/Scripts/Rutinas.js"></script>
    <script>cargarLista();</script>
</body>
</html>

Crear el archivo JavaScript con el código cliente para el TreeView

Antes que nada crear una carpeta llamada "Scripts" y arrastrar del explorador de Windows los archivos de jQuery: "jquery-1.8.2.min.js" y "jquery.unobtrusive-ajax.min.js", luego agregar un archivo de JavaScript llamado "Rutinas.js" y escribir el siguiente código:

function cargarLista() {
    $.ajax(
        {
            url: "Empleado/Listar/",
            type: "post",
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            success: exito,
            error: error
        });
}

function mostrarTabla(rpta) {
    var tabla = "";
    for (i = 0; i < rpta.length; i++) {
        tabla += "<tr class='FilaDatos'><td>" + rpta[i].IdEmpleado + "</td><td>" +
            rpta[i].Nombres + "</td><td>" + rpta[i].IdJefe + "</td></tr>";
    }
    var tbl = document.getElementById("tblEmpleado");
    tbl.innerHTML = tabla;
}

function mostrarTreeCheck(rpta) {
    var ul = $("#ulEmpleado");
    for (var i = 0; i < rpta.length; i++) {
        var li = "<li data-id='" + rpta[i].IdEmpleado + "'><input type='checkbox' />
                      <span style='cursor:pointer'>" + rpta[i].Nombres + "</span></li>";
        var padre;
        if (rpta[i].IdJefe == "0") padre = ul;
        else {
            var $elem = ul.find("li[data-id='" + rpta[i].IdJefe + "']");
            if ($elem.find("ul").length == 0) $elem.append("<ul>");
            padre = $elem.find("ul:first");
        }
        padre.append(li);
    }
}

function seleccionarTreeCheck() {
    $(function () {
        $("input[type='checkbox']").change(function () {
            $(this).siblings('ul')
                   .find("input[type='checkbox']")
                   .prop('checked', this.checked);
        });
    });
}

function expandirColapsarTreeCheck() {
    $(function () {
        $('#ulEmpleado').find('span').click(function (e) {
            $(this).parent().children('ul').toggle();
        });
    });
}

function exito(rpta) {
    mostrarTabla(rpta);
    mostrarTreeCheck(rpta);
    seleccionarTreeCheck();
    expandirColapsarTreeCheck();
}

function error(rpta) {
    alert(rpta.statusText);
}

Configurar el inicio y ejecutar la aplicación web

Para probar la aplicación web debemos configurar el inicio para lo cual nos vamos a la carpeta "App_Start" y abrimos el archivo "RouteConfig.cs" cambiando el nombre del controlador y la acción tal como se muestra en el siguiente código:

using System;
using System.Collections.Generic;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;

namespace JS01_TreeView_CheckBox
{
    public class RouteConfig
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Empleado", action = "Lista", id = UrlParameter.Optional }
            );
        }
    }
}

Finalmente, grabar y pulsar F5 para ejecutar la aplicación, mostrándose el resultado similar a la siguiente figura:


Seleccionar el primer empleado y ver como se marcan todos los empleados, tal como se muestra en la siguiente figura:


Dar clic sobre el segundo empleado y notar como se colapsa (oculta) sus subordinados, también colapsar el tercer empleado y el resultado será similar a la siguiente figura:


Comentario Final

En este post, un poco grande, hemos querido iniciar los Demos dedicados a ASP.NET MVC, empezando por la creación de un control TreeView con CheckBox que seleccione en forma jerárquica y expanda y colapse sus elementos.

Un camino hubiera sido usar Librerías de Controles de terceros como jQueryUI, Telerik KendoUI, Infragistics, DevExpress, etc. Pero como siempre el objetivo de este blog es enseñar a hacerlo uno mismo, para lo cual usamos JSON, JavaScript, jQuery y Ajax.

Espero les guste y si es así lo pueden re-postear en sus redes sociales: Google+, Facebook, Twitter, etc.

Descarga
2015_01_20_DemoDia_TreeView_CheckBox

El Libro del Día: Pro JavaScript Development

El Libro del Día: 2015-01-20

Titulo: Pro JavaScript Development
Autor: Den Odell
Editorial: Apress
Nro Paginas: 454

Capítulos:
Chapter 1: Object-Oriented JavaScript
Chapter 2: Documenting JavaScript
Chapter 3: Writing High-Quality JavaScript
Chapter 4: Boosting JavaScript Performance
Chapter 5: Design Patterns: Creational
Chapter 6: Design Patterns: Structural
Chapter 7: Design Patterns: Behavioral
Chapter 8: Design Patterns: Architectural
Chapter 9: Managing Code File Dependencies
Chapter 10: Mobile JavaScript Development
Chapter 11: Building Games with Canvas API
Chapter 12: Using WebRTC for Video Chat
Chapter 13: Using Client-Side Templates
Chapter 14: The Node.js Application Platform
Chapter 15: Build Tools and Automation
Chapter 16: Browser Developer Tools

Descarga:
Pro_JavaScript_Development

lunes, 19 de enero de 2015

El Libro del Día: Building JavaScript Games

El Libro del Día: 2015-01-19

Titulo: Building JavaScript Games
Autor: Arjan Egges
Editorial: Apress
Nro Paginas: 422

Capítulos:
Part I: Getting Started
Chapter 1: Programming
Chapter 2: Game Programming Basics
Chapter 3: Creating a Game World
Chapter 4: Game Assets
Part II: Creating Colorful Games
Chapter 5: Knowing What the Player Is Doing
Chapter 6: Reacting to Player Input
Chapter 7: Basic Game Objects
Chapter 8: Game Object Types
Chapter 9: Colors and Collisions
Chapter 10: Limited Lives
Chapter 11: Organizing Game Objects
Chapter 12: Finishing the Painter Game
Part III: Jewel Jam
Chapter 13: Adapting to Different Devices
Chapter 14: Game Objects in a Structure
Chapter 15: Gameplay Programming
Chapter 16: Game States
Chapter 17: Finishing the Jewel Jam Game
Part IV: Penguin Pairs
Chapter 18: Sprite Sheets
Chapter 19: Menus and Settings
Chapter 20: Game State Management
Chapter 21: Storing and Recalling Game Data
Chapter 22: Pairing the Penguins
Chapter 23: Finishing the Penguin Pairs Game
Part V: Tick Tick
Chapter 24: The Main Game Structure
Chapter 25: Animation
Chapter 26: Game Physics
Chapter 27: Intelligent Enemies
Chapter 28: Adding Player Interaction
Chapter 29: Finishing the Tick Tick Game
Part VI: Into the Great Wide Open
Chapter 30: Producing Games
Chapter 31: Publishing Games

Descarga:
Building_JavaScript_Games

domingo, 18 de enero de 2015

El Libro del Día: jQuery and JavaScript Phrasebook

El Libro del Día: 2015-01-18

Titulo: jQuery and JavaScript Phrasebook
Autor: Brad Dayley
Editorial: Addison Wesley
Nro Paginas: 382

Capítulos:
1 Jumping into jQuery, JavaScript, and the World of Dynamic Web Development
2 Using the JavaScript Language
3 Interacting with the Browser
4 Accessing HTML Elements
5 Manipulating the jQuery Object Set
6 Capturing and Using Browser and User Events
7 Manipulating Web Page Elements Dynamically
8 Manipulating Web Page Layout Dynamically
9 Dynamically Working with Form Elements
10 Building Web Page Content Dynamically
11 Adding jQuery UI Elements
12 Animation and Other Special Effects
13 Using AJAX to Communicate with Web Servers and Web Services
14 Implementing Mobile Web Sites with jQuery

Descarga:
jQuery and JavaScript Phrasebook

sábado, 17 de enero de 2015

El Libro del Día: Web Audio API

El Libro del Día: 2015-01-17

Titulo: Web Audio API
Autor: Boris Smus
Editorial: O'Reilly
Nro Paginas: 75

Capítulos:
1. Fundamentals
2. Perfect Timing and Latency
3. Volume and Loudness
4. Pitch and the Frequency Domain
5. Analysis and Visualization
6. Advanced Topics
7. Integrating with Other Technologies
8. Conclusion
A. Deprecation Notes
B. Glossary

Descarga:
Web_Audio_API

viernes, 16 de enero de 2015

El Libro del Día: Web Workers

El Libro del Día: 2015-01-16

Titulo: Web Workers
Autor: Ido Green
Editorial: O'Reilly
Nro Paginas: 60

Capítulos:
1. Overview
2. How and Where Can We Use Web Workers
3. Dedicated Workers
4. Inline Workers
5. Shared Workers
6. Debug Your Workers
7. Web Workers Beyond the Browser: Node

Descarga:
Web_Workers

jueves, 15 de enero de 2015

El Demo del Día: ComboBox con Imágen y Múltiples Columnas en WinForms

ComboBox con Imágen y Múltiples Columnas en WinForms

Ayer en el seminario vimos como crear Librerías de Controles para WinForms y no pude completar el último Demo de un Control ComboBox enlazado a Datos que soporte Imagen de Base de Datos y permita visualizar Múltiples Columnas.

Requerimiento

Se desea mostrar la información de los registros en varias columnas en una lista desplegable (ComboBox) y ademas poder incluir al inicio una Imagen también desde un origen de datos.

Solución

Debemos sobre escribir la clase ComboBox de WinForms y crear un par de propiedades llamada "ImageMember" para el campo de imagen y "DataColumns" para la lista de columnas a visualizarse la cual contiene el nombre del campo, el ancho de la columna y la alineación.

El control ComboBox tiene 2 formas de presentación: la Normal y la Dibujada, lo cual se logra cambiar configurando la propiedad "DrawMode". En nuestro caso, modificaremos la propiedad "DrawMode" a "OwnerDrawFixed" y programaremos en el evento "DrawItem" el dibujo con las columnas a presentar y la imagen.

Crear el Procedimiento Almacenado en la Base de Datos Northwind de SQL Server

Para listar los datos del empleado incluyendo su foto escribir el siguiente código:

Create procedure [dbo].[uspEmployeesListar]
As
Select EmployeeId,LastName,FirstName,IsNull(BirthDate,'1/1/1900') as Birthdate,Photo
From Employees

Actualizar los registros del campo Photo reemplazandolo desde archivo de disco

El campo Foto (Photo) de la tabla Empleados (Employees) de Northwind tiene registros de tipo bmp que no se verán en la aplicación, hay que actualizarlos por archivos jpg desde el disco.

Para eso entrar como Administrador al SQL Managment Studio y ejecutar la siguiente instrucción:

Update Employees Set Photo=(Select img.* from Openrowset(Bulk 'C:\Data\NET\Practicas\WinForms\ComboBox_Imagen_MultiColumna\Empleados\1.jpg', Single_Blob) img) where EmployeeId = 1

Nota: Realizar lo mismo para modificar las imágenes tantos registros tengas en la tabla empleados, para lo cual cambiar el archivo y el Id del Empleado (EmployeeId).

Crear una Aplicación Windows Forms en C#

En Visual Studio crear un proyecto Windows Forms en C# con el nombre de "ComboBox_Imagen_MultiColumna", luego cambiar el nombre del formulario a "frmConsultaEmpleado".

Crear la Clase Entidad del Negocio

Crear la clase beEmpleado escribiendo el siguiente código:

using System;
namespace ComboBox_Imagen_MultiColumna
{
    public class beEmpleado
    {
        public int IdEmpleado { get; set; }
        public string Apellido { get; set; }
        public string Nombre { get; set; }
        public DateTime FechaNacimiento { get; set; }
        public byte[] Foto { get; set; }
    }
}

Crear la Clase de Acceso a Datos

Crear la clase daEmpleado escribiendo el siguiente código:

using System;
using System.Collections.Generic; //List
using System.Data; //CommandType, CommandBehavior
using System.Data.SqlClient; //SqlConnection, SqlCommand, SqlDataReader
namespace ComboBox_Imagen_MultiColumna
{
    public class daEmpleado
    {
        public List<beEmpleado> listar(SqlConnection con)
        {
            List<beEmpleado> lbeEmpleado = null;

            SqlCommand cmd = new SqlCommand("uspEmployeesListar", con);
            cmd.CommandType = CommandType.StoredProcedure;
            SqlDataReader drd = cmd.ExecuteReader(CommandBehavior.SingleResult);
            if (drd != null)
            {
                lbeEmpleado = new List<beEmpleado>();
                int posIdEmpleado = drd.GetOrdinal("EmployeeID");
                int posApellido = drd.GetOrdinal("LastName");
                int posNombre = drd.GetOrdinal("FirstName");
                int posFechaNacimiento = drd.GetOrdinal("BirthDate");
                int posFoto = drd.GetOrdinal("Photo");
                beEmpleado obeEmpleado;
                while (drd.Read())
                {
                    obeEmpleado = new beEmpleado();
                    obeEmpleado.IdEmpleado = drd.GetInt32(posIdEmpleado);
                    obeEmpleado.Apellido = drd.GetString(posApellido);
                    obeEmpleado.Nombre = drd.GetString(posNombre);
                    obeEmpleado.FechaNacimiento = drd.GetDateTime(posFechaNacimiento);
                    if (!drd.IsDBNull(posFoto)) obeEmpleado.Foto = (byte[])drd.GetValue(posFoto);
                    lbeEmpleado.Add(obeEmpleado);
                }
                drd.Close();
            }

            return (lbeEmpleado);
        }
    }
}

Nota: Tiene que haberse creado el Procedimiento Almacenado "uspEmployeesListar" en la BD Northwind.

Crear la Clase de Reglas del Negocio

Crear la clase brEmpleado escribiendo el siguiente código:

using System;
using System.Configuration; //ConfigurationManager
using System.Data.SqlClient; //SqlConnection
using System.Collections.Generic; //List
namespace ComboBox_Imagen_MultiColumna
{
    public class brEmpleado
    {
        public List<beEmpleado> listar()
        {
            List<beEmpleado> lbeEmpleado = null;
            string conexion = ConfigurationManager.ConnectionStrings["conNW"].ConnectionString;
            using (SqlConnection con = new SqlConnection(conexion))
            {
                try
                {
                    con.Open();
                    daEmpleado odaEmpleado = new daEmpleado();
                    lbeEmpleado = odaEmpleado.listar(con);
                }
                catch (SqlException ex)
                {
                    //grabarLog(ex);
                }
                catch (Exception ex)
                {
                    //grabarLog(ex);
                }
            } //con.Close(); con.Dispose();
            return (lbeEmpleado);
        }
    }
}

Nota: Hay que hacer referencia a la librería "System.Configuration.dll" para usar la clase ConfigurationManager para leer el archivo de configuración.

Crear una Clase Entidad para configurar las Columnas del Combo

Crear la clase "DataColumn" escribiendo el siguiente código:

using System.Windows.Forms;
namespace ComboBox_Imagen_MultiColumna
{
    public class DataColumn
    {
        public string ColumnName { get; set; }
        public string HeaderText { get; set; }
        public int ColumnWidth { get; set; }
        public HorizontalAlignment Alignment { get; set; }
    }
}

Crear una Clase para el ComboBox con Imagen y Múltiples Columnas

Crear la clase "ComboImage" que herede del ComboBox escribiendo el siguiente código:

using System;
using System.Text;
using System.IO;
using System.Drawing;
using System.Collections.Generic;
using System.Windows.Forms;

namespace ComboBox_Imagen_MultiColumna
{
    public class ComboImage:ComboBox
    {
        private dynamic dataSource;
        public string ImageMember { get; set; }
        public List<DataColumn> DataColumns { get; set; }

        public ComboImage()
        {
            this.ItemHeight = 25;
            this.DrawMode = DrawMode.OwnerDrawFixed;
            this.DrawItem += new DrawItemEventHandler(dibujarElemento);
            this.MeasureItem += new MeasureItemEventHandler(configurarTamaño);
        }

        private void dibujarElemento(object sender, DrawItemEventArgs e)
        {
            int x = e.Bounds.X;
            int y = e.Bounds.Y;
            int indice = e.Index;
            dataSource = DataSource;
            string item="";          
            if (DataColumns != null && DataColumns.Count > 0)
            {
                StringBuilder sb = new StringBuilder("");
                DataColumn columna;
                string valor = "";
                for (int i = 0; i < DataColumns.Count; i++)
                {
                    columna = DataColumns[i];
                    valor = dataSource[indice].GetType().GetProperty(columna.ColumnName).
                                GetValue(dataSource[indice], null).ToString();
                    if (columna.Alignment.Equals(HorizontalAlignment.Right))
                        sb.Append(String.Format("{0} │ ", valor.PadLeft(columna.ColumnWidth, ' ')));
                    else sb.Append(String.Format("{0} │ ", valor.PadRight(columna.ColumnWidth, ' ')));
                }
                item = sb.ToString();
            }
            else
            {
                if (!String.IsNullOrEmpty(DisplayMember))
                {
                    item = dataSource[indice].GetType().GetProperty(DisplayMember).
                               GetValue(dataSource[indice], null).ToString();
                }
            }
            if (!String.IsNullOrEmpty(ImageMember))
            {
                byte[] buffer = dataSource[indice].GetType().GetProperty(ImageMember).
                                         GetValue(dataSource[indice], null);
                if (buffer != null && buffer.Length > 0)
                {
                    MemoryStream ms = new MemoryStream(buffer);
                    Image img = null;
                    try{
                        img = Image.FromStream(ms);
                        e.Graphics.DrawImage(img, x, y, 25, 25);
                    }
                    catch(Exception ex)
                    {
                        //Grabar Log
                    }                                    
                }
                x = x + 20;
            }
            e.Graphics.DrawString(item, new Font("Courier New", 8), Brushes.Black, x, y+5);
            e.DrawFocusRectangle();
        }

        private void configurarTamaño(object sender, MeasureItemEventArgs e)
        {
            e.ItemWidth = this.Width;
            e.ItemHeight = 200;
        }
    }
}

Nota: Esta clase creada hereda las propiedades DataSource, DisplayMember y ValueMember del ComboBox pero adicionalmente se crean las propiedades DatColumns y ImageMember y se sobre escribe los eventos DrawItem y MeasureItem para dibujar las columnas y la imágen.

Diseñar y Programar el Formulario con el ComboImage creado

Abrir el formulario "frmConsultaEmpleado" y realizar el siguiente diseño:


Escribir el siguiente código en el formulario:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.IO;
using System.Drawing;
using System.Windows.Forms;

namespace ComboBox_Imagen_MultiColumna
{
    public partial class frmConsultaEmpleado : Form
    {
        private List<beEmpleado> lbeEmpleado;

        public frmConsultaEmpleado()
        {
            InitializeComponent();
        }

        private void listarEmpleados(object sender, EventArgs e)
        {
            brEmpleado obrEmpleado = new brEmpleado();
            lbeEmpleado = obrEmpleado.listar();
            cboEmpleado.DataSource = lbeEmpleado;
            cboEmpleado.DisplayMember = "Apellido";
            cboEmpleado.ValueMember = "IdEmpleado";
            cboEmpleado.ImageMember = "Foto";
            List<DataColumn> columnas = new List<DataColumn>();
            columnas.Add(new DataColumn { ColumnName="IdEmpleado",
                ColumnWidth=3, Alignment=HorizontalAlignment.Right});
            columnas.Add(new DataColumn { ColumnName = "Apellido",
                ColumnWidth = 20, Alignment = HorizontalAlignment.Left });
            columnas.Add(new DataColumn { ColumnName = "Nombre",
                ColumnWidth = 10, Alignment = HorizontalAlignment.Left });
            cboEmpleado.DataColumns = columnas;
            cboEmpleado.SelectedIndex = -1;
        }

        private void mostrarEmpleadoSeleccionado(object sender, EventArgs e)
        {
            int n = cboEmpleado.SelectedIndex;
            if (n > -1)
            {
                txtCodigo.Text = lbeEmpleado[n].IdEmpleado.ToString();
                txtApellido.Text = lbeEmpleado[n].Apellido;
                txtNombre.Text = lbeEmpleado[n].Nombre;
                txtFechaNacimiento.Text = lbeEmpleado[n].FechaNacimiento.ToShortDateString();
                byte[] foto = lbeEmpleado[n].Foto;
                MemoryStream ms = new MemoryStream(foto);
                try
                {
                    picFoto.Image = Image.FromStream(ms);
                }
                catch (Exception ex)
                {
                    picFoto.Image = null;
                }
            }
            else
            {
                txtCodigo.Clear();
                txtApellido.Clear();
                txtNombre.Clear();
                txtFechaNacimiento.Clear();
                picFoto.Image = null;
            }
        }
    }
}

Nota: Asociar al evento "load" del formulario la función "listarEmpleados" y al evento "SelectedIndexChanged" del ComboImage llamado "cboEmpleado" la función "mostrarEmpleadoSeleccionado".

Modificar el archivo App.Config para incluir la Cadena de Conexión

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <connectionStrings>
    <add name="conNW" providerName="System.Data.SqlClient" connectionString="uid=UsuarioNW;pwd=123456;data source=DSOFT\Sqlexpress;initial catalog=NW"/>
  </connectionStrings>
    <startup>
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
    </startup>
</configuration>

Probar la Aplicación Windows Forms

Grabar la aplicación y ejecutarla con F5. Desplegar el ComboBox y se mostrará la siguiente ventana:


Seleccionar un registro y se mostrará los datos del empleado, tal como se muestra a continuación:


Nota: La consulta es desconectada ya que los datos del empleado se obtienen de la Lista de Objetos.

Comentario Final

En este post vimos como mostrar en un ComboBox de WinForms múltiples columnas y también imágenes, para lo cual creamos un control personalizado configurando la propiedad "DrawMode" y agregamos propiedades "ImageMember" y "DataColumns", luego dibujamos en el evento "DrawItem".

Como ven no es tan díficil crear tus propios controles personalizados, como siempre nos ayudamos con un poco de Reflection para obtener propiedades (nombres y valores).

Espero les sirva.

Descarga
Demo_ComboBox_Imagen_MultiColumna

Entrenamiento - Cuarto y Ultimo Seminario .NET (Creación de Controles en ASP.NET)

Cuarto y Ultimo Seminario .NET: Creación de Controles en ASP.NET (Web Forms y MVC)

Quiero invitar a los interesados al ultimo seminario que tratara sobre "Creación de Controles en ASP.NET", en donde se verá como crear librerías de Controles Web Forms y MVC, habra ejemplos sobre controles Grillas Paginadas, Ordenadas, con Filtros en cabeceras, Exportaciones de Datos, etc.
También crearemos controles de gráficos, de búsqueda y el control ubigeo que por falta de tiempo no se pudo hacer ayer.

Gracias a todos los que asistieron a los seminarios anteriores, sobre a todo los que me vienen acompañando hace muchos años y a los que hicieron el esfuerzo por estar en los 3 seminarios anteriores, con ellos seguiremos trabajando, como lo hacíamos antes.

La idea era compartir con mas personas temas avanzados y temas del futuro en desarrollo de software, tales como "El Internet de las Cosas", "Impresion 3D" y sus implementaciones en "HTML5" y "JavaScripts APIs".

Sobre HTML5 se verían temas como:
- Formularios y Nuevos Controles
- Canvas
- SVG
- Audio y Video

Sobre JavaScripts APIs se verían temas como:
- Web Workers
- Geolocation
- FileStorage (SessionStorage, LocalStorage e IndexedDB)
- Web Audio API
- File System API
- WebGL
- WebSockets
- WebRTC
- Speech API, etc

Pero parece que muchos desean aprender temas actuales para su trabajo, es decir, como Crear Aplicaciones Web, Reportes, Impresiones, etc, temas que se ven en cualquier curso de capacitación. La idea era no repetir con los mismos temas sino prepararnos para el futuro. Pero estamos en un país donde la gente solo ve el día a día y no prevee el mañana.

Particularmente, seguiré trabajando en estos temas y este año lanzare varias librerías y generadores como les había comentado en las charlas. En realidad mi objetivo con el Blog y los Seminarios era no avanzar solo sino que muchas personas se sumaran a esto, pero cada uno establece en su vida prioridades y algunos no toman en serio la necesidad de mejorar cada día ni "entender como funcionan la cosas".

Saludos a todos y que la suerte los acompañe (la van a necesitar)

PD: Los que asistieron al seminario de ayer, hoy les enviare un mail con todos los Demos + Practicas que hice y también estaré publicando en el Blog un ejemplo de un Control Combo con Múltiples Columnas e Imágenes.

El Libro del Día: Async Javascript

El Libro del Día: 2015-01-15

Titulo: Async Javascript
Autor: Trevor Burnham
Editorial: The Pragmatic Programmers
Nro Paginas: 97



Capítulos:
1. Understanding JavaScript Events
2. Distributing Events
3. Promises and Deferreds
4. Flow Control with Async.js
5. Multithreading with Workers
6. Async Script Loading
A1. Tools for Taming JavaScript

Descarga:
Async_Javascript

miércoles, 14 de enero de 2015

El Libro del Día: Professional WCF 4

El Libro del Día: 2015-01-14

Titulo: Professional WCF 4
Autor: Pablo Cibraro, Kurt Claeys, Fabio Cozzolino, Johann Grabner
Editorial: Wrox
Nro Paginas: 483

Capítulos:
CHAPTER 1 Design Principles and Patterns
CHAPTER 2 Service Contracts and Data Contracts
CHAPTER 3 Bindings
CHAPTER 4 Clients
CHAPTER 5 Instancing
CHAPTER 6 Workflow Services
CHAPTER 7 Understanding WCF Security
CHAPTER 8 WCF Security in Action
CHAPTER 9 Federated Authentication in WCF
CHAPTER 10 Windows Azure Platform AppFabric
CHAPTER 11 Creating a SOA Case
CHAPTER 12 Creating the Communication and Integration Case
CHAPTER 13 Creating the Business Process
CHAPTER 14 Hosting

Descarga:
Professional_WCF_4

martes, 13 de enero de 2015

Personajes de la Computación - Yahoo!

Personajes de la Computación - Yahoo!

Prólogo

Durante casi 2 décadas la plataforma de Desarrollo es la Web, teniendo 2 grandes componentes:
- Front End: HTML, CSS, JavaScript, Data (XML, JSON, etc).
- Back End: Servidor Web, Páginas del Servidor, Base de Datos, etc.

En este contexto, existe mucha literatura sobre como desarrollar aplicaciones para la web, pero pocas dan énfasis a los 3 temas mas importantes en aplicaciones web y móviles:
- Seguridad
- Performance
- Escalabilidad

En este post presento una compilación de algunos personajes que han trabajado para Yahoo! los cuales nos han dejado una gran obra sobre todo en el tema de "Performance Web Sites" y "Buenas Practicas de Desarrollo", empezando por grandes maestros como Douglas Crockford y Steve Souders, asi como nuevos talentos, tales como Nicholas C. Zakas y Stoyan Stefanov, entre otros.

En mi blog he posteado mas de 250 libros hasta el momento, pero los que voy a publicar a continuación son los mas importantes, los pioneros y casi únicos libros sobre el tema de "Performance" y  "Buenas Prácticas en JavaScript".

En el Perú todavía tenemos roles tradicionales en el área de desarrollo como: programador, analista, arquitecto, tester, soporte, etc. En USA, cada vez cobra mas importancia los roles de:
- Ingeniero y Arquitecto JavaScript
- Ingeniero y Arquitecto en Web Performance

Para todos los que quieren convertirse en Ingenieros (nivel inicial) y Arquitectos (siguiente nivel) de JavaScript y Web Performance, les dejo los libros que son indispensables leer y en donde esta como mejorar nuestros sitios web y nuestras aplicaciones.

Sobre Yahoo

Yahoo! es una empresa de medios globales creada en 1994 por dos estudiantes de postgrado de la Universidad de Stanford: Jerry Jang (Taiwan) y David Filo (USA), pero recién se constituyo como empresa en 1995.

Entre sus productos principales tenemos:
- Yahoo Search
- Yahoo Mail
- Yahoo Messenger
- Yahoo Grupos
- Yahoo Juegos
- Yahoo Compras
- Yahoo Subastas

En cuanto a desarrollo crearon una Librería de JavaScript llamada YUI Library que lamentablemente dejo de tener soporte desde el año pasado y en los últimos años no le fue también a Yahoo! y dejo ir a sus principales ingenieros y arquitectos.

Nota: Actualmente, ante el convenio con Mozilla firmado a finales del 2014, en el cual Firefox tiene como buscador predeterminado a Yahoo Search y No a Google Search, su participación en el mercado ha mejorado.

Jerry Yang y David Filo

Pais Origen: Taiwan y USA
Año de Nacimiento: 1968 y 1966
Fundadores de: Yahoo (1995)


Enlaces
Yahoo
Jerry_Yang
David_Filo

Douglas Crockford

País Origen: USA
Creador de: JSON (2001)
Especialista en: JavaScript
Trabajo Actual: PayPal


Enlaces
Douglas_Crockford
Videos_Crockford_YUI_Library

Libros
DouglasCrockford_2008_JavaScriptTheGoodParts


Steve Souders

País Origen: USA
Especialista en: Web Performance
Creador de: YSlow, HTTP Archive, Cuzillion, jDrop, SpriteMe, ControlJS, BrowserScope
Co-Fundador: Firebug Working Group
Trabajo Actual: Google


Enlaces
Google+
Sitio_Web
Amazon

Libros
SteveSouders_2007_HighPerformanceWebSites



SteveSouders_2009_EvenFasterWebSites



Nicholas C. Zakas

Pais Origen: USA
Especialista en: Web Performance, JavaScript
Contribuidor de: YUI Library
Creador de: Cookie Utilitie, Profiler, YUI Test
Trabajo Actual: Box


Enlaces
Blog
Linked In
Twitter

Libros
NicholasZakas_2007_O'Reilly_ProfessionalAjax



NicholasZakas_2010_O'Reilly_HighPerformanceJavaScript



NicholasZakas_2012_O'Reilly_MaintainableJavaScript



NicholasZakas_2012_Wrox_ProfessionalJavascriptForWebDevelopers


NicholasZakas_2014_NoStarchPress_ThePrinciplesObjectOrientedJavaScript


Stoyan Stefanov

Pais Origen: USA
Especialista en: Web Performance, JavaScript
Co Creador de: Smush.it, YSlow 2.0
Trabajo Actual: Yahoo


Enlaces
Google+
Blog
Twitter

Libros
StoyanStefanov_2008_Packt_ObjectOrientedJavaScript


StoyanStefanov_2010_O'Reilly_JavaScriptPatterns


StoyanStefanov_2012_O'Reilly_WebPerformanceDaybookVolume2


Cal Henderson

Pais Origen: Inglaterra
Año de Nacimiento: 1981
Especialista en: Web Performance, Scalability
Co-Fundador de: B3ta
Trabajo Actual: Tiny Speck


Enlaces
Cal_Henderson

Libros
CalHenderson_2006_O'Reilly_BuildingScalableWebSites


Kyle Loudon

Pais Origen: USA
Especialista en: Web-Mobile Apps, Scalability
Co-Creador: Apple iPod (2011 Pixo)
Trabajo Actual: Realtor.com


Enlaces
Sitio_Web

Libros
KyleLoudon_2010_O'Reilly_DevelopingLargeWebApplications



Comentario Final

Mi comentario final, es que este post pudo haberse llamado "Performance Web Sites" ya que tiene los pocos libros que hay sobre el tema escritos por expertos que trabajaron en Yahoo y que la mayoría esta actualmente en otras empresas, pero nos dejaron sus experiencias en estos libros.

Se que para la mayoría de personas, incluyendo muchos visitantes del blog, consideran que lo mas importante son los Demos que publico, los cuales son los post mas vistos, pero la idea del blog era mejorar el nivel de los desarrolladores, sobre todo de los "expertos" y justamente los Libros que publico son la principal materia prima para lograrlo, aunque muchos parecen no entender y luego están preguntando:
- Como hago que mi sitio sea seguro
- Como hago para dar velocidad a mis paginas
- Como hago para que no se bloquee el acceso a las paginas, etc.

La respuesta la encontrarás en la teoría de los grandes maestros (gurus, super expertos o como quieran llamarles).

Este post costo mucho tiempo en compilarlo, esperando que sea de su agrado y colaborar con un poco de historia y material de estudio obligatorio.

Finalmente, les comento una frase: "Dime que lees y te diré como quien quieres ser".

PD: "Y si no lees nada no quieres ser nada".