lunes, 25 de diciembre de 2017

Understanding Bitwise Logical Operators with C#

Bit manipulation operations, including logical and shift operations, perform low-level operations directly on the binary representations used in integers. The ability to operate directly on binary might save large amounts of memory, might enable certain computations to be performed very efficiently, and can greatly simplify operations on collections of bits, such as data read form or written to parallel I/O ports.

The C# programming language supports bitwise operations on both numeric and boolean data types. These are represented as the operators ~, &, ^, and | for the bitwise operations of NOT (bitwise complement), bitwise AND, bitwise XOR, and bitwise OR, respectively. The operators work in parallel on all bits of the operands and never cause overflow, even in a checked context.

Unsigned integers are normally used with the bitwise operators.

Bitwise NOT (complement)

The bitwise complement or NOT is used to flip the bits of a value, this operator is unary and inverts the bit value. Since this operator is a unary operator it cannot be combined with the = sign.

Fig 1 Example of bitwise NOT operator

Bitwise XOR

When combining two values with the logical XOR bitwise operator, you get the following result: if both bits are the same, the result is 0 else if 1 bit is 0 and the other is 1, the result is 1

Fig 2 Example of bitwise XOR Operator

Bitwise OR

When combining 2 byte values results in the following: if both bits are 0, the result is 0. If either or both bits are 1, the result is 1.

Fig 3 Example of bitwise OR operator

Bitwise AND

The bitwise AND operator produces a one in the output bit if both input bits are one; otherwise it produces a zero.

Fig 4 Example of bitwise AND operator

When using the bitwise operator, it’s useful to display values in binary to show the precise effects of these operators. The following example demonstrate the use of the bitwise operators, you can download the source code from here.

The application sample is shown below:

Fig 1 Testing the AND operator

Fig 2 Testing the Inclusive OR operator

Fig 3 Testing the exclusive OR operator

Fig 4 Testing the NOT operator, this operator is unary, so there is not result using two integers.

martes, 5 de diciembre de 2017

Understanding abstract classes with C#

The C# programming language enables a class designer to specify that a base class declares a method that does not supply an implementation. This is called an abstract method. The implementation of this method is supplied by the derived classes. Any class with one or more abstract method is called an abstract class.

Fig 1 UML model of the abstract class.

The purpose of an abstract class is primarily to provide an appropriate base class from which other classes can inherit and thus share a common design. However, abstract classes can have data attributes, concrete methods, and constructors. For example, the Vehicle class might include load and maxLoad attributes and a constructor to initialize them. Not all inheritance hierarchies contain abstract classes. However, programmers often write client code that uses only abstract base class types to reduce the client code's dependencies on a range of specific derived class types. The C# compiler always prevents you form instantiating an abstract class, for example the following statement is illegal.

 Vehicle v = new Vehicle(); // this is illegal and the compiler generates an error.

Although we cannot instantiate objects of abstract base classes, we will see that we can use abstract base classes to declare variables that can hold references to objects of any concrete classes derived from those abstract classes.

The employee abstract class: A example using Polymorphism through inheritance

What is polymorphism?

The term polymorphism refers to the ability of two or more objects belonging to different classes to respond to exactly the same message (method call) in different class-specific ways, thus polymorphism enables us to "program in the general" rather than "program in the specific".

Polymorphism allows:

  • Different behavoirs from the same type.
  • Runtime polymorphism is done via overriding.
  • Compile time polymorphism is done via method overloading.
  • Invoke methods of a derived class through a base class.
I think the best way to learn about this concept is through an example, so I wrote a set of examples using an inheritance hierarchy containing types of employees in a company.

Fig 2 Employee hierarchy UML class diagram.

We use abstract class Employee to represent the general concept of an employee. The classes that inherit from Employee are: CommissionEmployee, PieceEmployee and HourlyEmployee.

1. I use abstract class Employee to represent the general concept of an employee. The classes that inherit from Employee are: CommissionEmployee, PieceEmployee and HourlyEmployee.

Listing 1. Abstract base class Employee

In this example, class Employee will provide two methods Earnings and Details, and properties that manipulate an Employee's instance variables, the method Earnings certainly applies generally to all employee's, but each earnings calculation depends on the derived employee's class. So these two methods must be abstract in the Employee class because an implementation does not make sense there, so each derived class must override those methods with an appropriate implementation.

2. I wrote three concrete classes: HourlyWorker, CommissionWorker and PieceWorker. Such classes provide implementations of the abstracts methods declared in our abstract class, because abstract base classes are too general to create real objects.

Listing 2. Concrete derived class HourlyEmployee

Listing 3. Concrete derived class CommissionEmployee

Listing 4. Concrete derived class PieceWorker

To test our example, the following program creates an array of our abstract base class Employee, then assigns the four instances of our concretes classes to the array variable. Finally, the program iterates through array Employee and polymorphically invokes methods Earnings and Details to display the output of each of these methods.

Listing 5. Test program for our example.

Fig 3. The output for our example.

Note: Those examples were based on the examples included in: Deitel's developer series C# 2010 for programmers.

jueves, 30 de noviembre de 2017

The static keyword in C#

The static keyword declares members (attributes, methods) that are associated with the class rather than the instances of the class.

Sometimes it is desirable to have a variable that is shared among all instances of a class. For example, you could use this variable as the basis for communication between instances or to keep track of the number of instances that have been created.

You achieve this shared effect by making the variable with the keyword static. Such a variable is sometimes called a class variable to distinguish it from a member of instance variable, which is not shared.

Fig1. UML Object Diagram showing the Client class and two unique instances.

In this example, every object that is created is assigned a unique serial number, starting at 1 and counting upwards. The variable counter is shared among all instances, so when the constructor of one object increments counter, the next object to be created receives the incremented value.

A static variable is similar in some ways to a global variable in other languages.

Listing 1. Example marking the variable counter with the keyword static.

If a static is not marked as private, you can access it from outside the class. To do this, you do not need an instance of the class, you can refer to it through the class name.

Listing 2. Example referring to the static variable counter.

Sometimes you need to access program code when you do not have an instance of a particular object available. A method that is marked using the keyword static can be used in this way and is sometimes called a class method.

Listing 3. A method marked using the static keyword.

Fig 2. Output of the program is.

You should access methods that are static using the class name rather than an object reference.

Because you can invoke a static method without any instance of the class to which it belongs, there is no this reserved keyword applicable, because static variables and methods exist independently of any class objects, even when there are no objects of that class. The consequence is that a static method cannot access any variables other than the local variables, static attributes, and its parameters. Attempting to access non-static attributes causes a compiler error.

Listing 4. A complete example

Fig 3. Output for the complete example

You should be aware of the following when using static methods:

  • Inside the basic console application, we have the startup procedure Main. Main is defined as a static member, which means we do not have to have an instance of the enclosing class
  • Constants are considered static members. Therefore, they do not need to be-for that matter, they cannot be-marked with the static keyword.

miércoles, 27 de septiembre de 2017

Overriding Methods in C#

In addition to producing a new class based on an old one by adding additional features, you can modify existing behavior of the parent class.

If a method is defined in a derived class so that the name, return type, and argument list match exactly those of a method in the parent class, then the new method is said to override the old one.

The keyword virtual

In C#, a class can declare virtual methods, properties, and indexers, and derived classes can override the implementation of these function members.

The keyword virtual allows programmers to specify methods that a derived class can override, C# methods are non-virtual by default and must be explicitly declared as virtual.

The implementation of a non-virtual method is invariant: The implementation is the same whether the method is invoked on an instance of the class in which it is declared or an instance of derived class. In contrast, the implementation of a virtual method can be changed by derived classes.

The keyword override

To override a base-class method definition, a derived class must specify that the derived-class method overrides the base-class method with keyword override in the method header.

If the override modifier is not used, the new member hides the inherited member, and a compiler warning occurs. If a derived class attempts to override a non-virtual inherited member, a compiler error will occur. The following examples illustrate the using of virtual and override keywords.

Fig 1. Class diagram for Employee and Manager using Inheritance.

Listing 1: Sample code for Employee class

Listing 2: Sample code for Manager class

Consider these sample methods in the Employee and Manager classes:
Fig 2. The GetDetails method of the Employee class.

Fig 3. The GetDetails method of the Manager class.

The Manager class has a GetDetails method by definition because it inherits one from the Employee class. However, the original method has been replaced, or overridden, by the derived class’s version.

Listing 3 A simple program to demonstrate how method overriding works.

Fig 4 The output of executing this program is the following.

viernes, 15 de septiembre de 2017

Understanding Inheritance in C#

Inspired from biological modeling, inheritance allows new classes to be constructed that inherit characteristics (fields and methods) from ancestor classes while typically introducing more specialized characteristics, new fields, or methods. A subclass is logically considered to be a specialized version or extension of its parent and by inference its ancestor classes.

In programming, you often create a model of something, and then need a more specialized version of that original model.

Fig 1. Shows the UML class diagrams that model the Employee and Manager classes.

Listing 1. A possible implementation of Employee class.

Listing 2. A possible implementation of Manager class.

These codes illustrate the duplication of attributes between Manager class and the Employee class. Additionally, there could be a number of methods applicable to both classes. In object-oriented languages, special mechanisms are provided that enable you define a class in terms of a previously defined class.

One of its main mechanism is called Inheritance. Inheritance is a form of software reusability in which classes are created by absorbing an existing class’s data and behaviors and embellishing them with new capabilities. The next figure shows the diagram in which the Manager is a derived class of Employee base class.

Fig 2. Class diagram using Inheritance.

Listing 3. The Employee class.

Listing 4. The Manager class that inherits from class Employee.

Single Inheritance

The C# programming language permits a class to extend one other class only. This restriction is called single inheritance. With single inheritance, a class is derived from one base class. C# does not support multiple inheritance.

Once created, each derived class can become the base class for future derived classes. Typically, the derived class contains the behaviors of its base class. Therefore, a derived class is more specific than its base class and represents a more specialized group of objects.

The next image shows the base class Employee and three derived classes: Engineer, Manager and Secretary. The Manager is also the base class from which the derived class Director explicitly inherits.

Fig 3. An example Inheritance tree.

The Employee class contains three attributes (Name, Salary, and BirthDate), as well as one method (GetDetails). The Manager class inherits all of these members and specifies an additional attribute, department, as well as the GetDetails method. The Director class inherits all of the members of Employee and Manager and specifies a CarAllowance attribute and a new method, IncreaseAllowance.

domingo, 3 de septiembre de 2017

Fetching JSON Data with Angular $http.get() function.

Angular has built-in support for communication with remote HTTP servers and includes some low-level methods of fetching and posting the data. Angular comes with the $http service which includes a few methods we can utilize with all verbs of the REST protocol.

We'll look at a example using the .$http.get() request. The $http.get() method accepts two parameters: URL and config object.

The first parameter URL is always required and the config is optional, the shortcut $http.get() method initiates a GET request to the server to retrieve data from the server. This example has the following files:

  • books.js: it contains the data in JSON format.
  • app.js: it contains the functional logic for the example
  • getexample.html: contains the front for the example

Fig.1. The source code for the JSON file

Fig 2. The source code for the app.js

In the previous example the controller defines a dependency to the $scope and the $http module. An HTTP GET request to the data “books.json” endpoint is carried out with the get method. It returns a $promise object with a success and error method.

Fig 3. The code for the web page

Fig 4. Running the example

If you open the web page up in your browser, you'll see a standard HTML button created, when you press the button the $http service makes an ajax call and set response to the scope's property books. Thus books can be used to draw a list in the HTML page.

jueves, 10 de agosto de 2017

The this Reference

Every object can access a reference to itself, called the this reference. The this reference can refer implicitly to the instance variable, properties and methods of an object.

Two uses of the this keyword are:

  1. To resolve ambiguity between instance variables and parameters
  2. To pass the current object as a parameter to another method
The following class demonstrates these uses.

Fig 1 The Use of the this Keyword

The first constructor receives three uint parameters which names are identical to the instance variables of the class. I did this to illustrate explicit use of the this reference.

Fig 2 This reference output

The explicit use of the this reference can increase program clarity in some contexts where this is optional.

martes, 1 de agosto de 2017

(Windows Communication Foundation): Construir el proxy de manera programática

WCF es el marco de desarrollo de aplicaciones que agrupa las tecnologías distribuidas de Microsoft para la construcción de aplicaciones orientadas a servicios.

Fig 1 WCF agrupa las tecnologías distribuidas de MS en un solo marco de trabajo

WCF ayuda a construir aplicaciones orientadas a servicios de forma práctica

  • Proporciona herramientas para la creación, el consumo y la puesta en operación de los servicios.
  • Todas las funcionalidades son administradas por el runtime
  • No es necesario aprender o conocer a profundidad WSDL.
La arquitectura de WCF puede resumirse en el siguiente esquema.

Fig 2 Una vista general de la arquitectura de WCF

En este esquema se muestra los siguientes pasos de comunicación:

  1. Los clientes utilizan un objeto proxy para enviar mensajes al servicio. Este proxy se encarga de todo el mecanismo de comunicación y funciona como si fuera un objeto local.
  2. Los clientes envían mensajes y reciben respuestas mediante el uso de un Endpoint que los conecta con el servicio.
  3. Un servicio WCF utiliza un dispatcher para convertir el mensaje de petición en la invocación de un método en el servicio.
  4. Los servicios escuchan por los mensajes en uno o más Endpoints.

La estructura de un servicio WCF: El contrato y la implementación

Para ejemplificar cada uno de los componentes de la estructura estándar de un servicio WCF escribí un servicio conversor de temperaturas para convertir entre las diferentes escalas de temperatura: Celsius, Kelvin, Fahrenheit. Este servicio WCF conversor de temperaturas tiene los siguientes elementos:

1.Un contrato para el servicio: qué es la interfaz que define las operaciones y como es el proceso de comunicación para el intercambio de mensajes. Este contrato contiene los siguientes elementos:

a) La referencia al ensamblado System.ServiceModel, este ensamblado proporciona los objetos necesarios para construir los servicios WCF.
b) Una interfaz con el atributo ServiceContract que identifica a la interfaz que el servicio implementará.
c) El atributo OperationContract para identificar cada uno de los métodos que el servicio expondrá.
Fig 3 Código del contrato (Service Contract) para el servicio convertidor de temperatura.

2. La implementación del servicio: Es la clase que implementará la interfaz Service Contract, esta clase utilizará los componentes del .NET Framework con unos atributos WCF opcionales para controlar las características del servicio tales como el tiempo de vida y las sesiones.

Fig 4 Código de la clase de implementación de servicio (Service class)

Ambos archivos, (el contrato IGradeConverter y la implementación GradeConverterImplementation) deben compilarse como biblioteca :NET con el siguiente comando.

$ mcs /t:library -pkg:wcf IGradeConverter.cs GradeConverterImplementation.cs 
/out:Examples.WCFGradeConverter.Service.dll

El proceso huesped (Self-hosted application)

3. Un proceso huésped: Este proceso huésped debe proporcionar el ambiente de ejecución para un servicio WCF. Para hospedad un servicio WCF existen 3 opciones principales:

  1. Self hosted managed application
  2. IIS
  3. WAS

En este ejemplo utilizaré la opción Self hosted managed application.

Fig 5 Código del programa huésped WCF (Self-hosted).

Este proceso huésped requiere información de configuración, por lo que esta información se proporciona en un archivo de configuración.

Fig 6 El archivo App config del proceso huesped.

Para compilar el proceso huésped utilizamos los siguientes comandos:

 $ mcs -r:Examples.WCFGradeConverter.Service.dll -pkg:wcf GradeConverterHost.cs 
 

Construyendo el programa cliente GTK# temperature converter.

Para consumir el servicio WCF, escribí un proyecto cliente GTK# en Monodevelop que invoca las operaciones del servicio, en la siguiente imagen se puede ver la GUI del programa cliente.

Fig 7 El aspecto final del convertidor de temperaturas.

Fig 8 El proyecto y la GUI del convertidor de temperaturas GTK# en MonoDevelop

Hay dos maneras para que un cliente consuma un servicio WCF:

  1. Puedes generar un objeto proxy manualmente, utilizando la herramienta: svcutil desde la línea de comandos.
  2. Puedes usar la clase ChannelFactory para crear un proxy de manera programática.

Fig 9 Utilizando la clase Channel para crear un proxy

Para probar el ejemplo, primero hay que iniciar el proceso host.

Fig 10 Ejecutando el proceso host

Como último paso abrimos el proyecto cliente GTK# y lo ejecutamos desde Mono Develop

Fig 11 Ejecutando el programa desde Monodevelop y convirtiendo 100 grados celsius.

Fig 12 Ejecutando el programa y convirtiendo 451 grados farehnheit.

viernes, 21 de julio de 2017

C# Networking Basics: Sockets

Socket is the name given to an abstraction through which an application may send and receive data. The term “Socket” refers to the Berkeley Sockets Interface, which was developed in 1978 for network programming with UNIX and was popularized by C programmers.

Because of the popularity of that abstraction, this term has been reused in many programming model including .NET technology. The main types of sockets in TCP/IP today are: stream sockets and datagram sockets, both use TCP as the end-to-end protocol with IP underneath, the .NET framework provides a clear distinction between using TCP and UDP, defining a separate set of classes for both protocols.

Stream Sockets

Socket based communications in C# employ stream sockets, when processes communicate over a network .NET Framework technology uses the streams model to establish a connection between two o more processes. With stream sockets, a process (running program) establishes a connection to another process.

A socket can hold two streams: one input stream and one output stream when the sender sends data to another process through the network by writing to the output stream associated with the socket, the receiver reads data written by the sender by reading from the input stream associated with the socket. While the connection is in place, data flows between the processes in continuous stream.

Addressing the connection

When you make a network connection, you need to know the address or the name of the remote machine, IPv4 uses 32 bit binary addresses to identify communicating hosts a client must specify the IP address of the host running the server program when it initiates the communication. In addition, a network connection requires a port number, after you connect to the proper host, you must identify a particular purpose for the connection. So, you can use a particular port number to communicate with the specific program.

Port Numbers

In TCP/IP port numbers are 16-bit numbers and the values range from 0-65535. In practice, port numbers below 1024 are reserved for predefined services, and you should not use them unless communicating with one of those services, client port numbers are allocated by the operating system to something not in use, while server port numbers are specified by the programmer, and are used to identify a particular service. Both client and server must agree in advance on which port to use. If the port numbers used by the two parts of the system do not agree, communication does not occur. Ports are divided into the following ranges:

  • 0-1023: well-known ports
  • 1024-49151: registered ports
  • 49152-65535: dynamic or private ports

Minimal TCP/IP Server

The System.Net.Sockets.TcpListener class is used to create server applications. TcpListener provides a simple wrapper around the socket classes, here is a simple TCP Server that accepts a single client connection.

Example 1: Implementing a network streaming server

To compile this program using mono, type the following command at your command prompt:
$ mcs /t:exe -out:SimpleTCPServer.exe SimpleTCPServer.cs
And to run it, type this command line:
$mono SimpleTCPServer.exe
And you’ll see the following output on your screen:

Fig 1: Result of running the SimpleTCPServer program.

Minimal TCP/IP Client

The client is a simple console application, this application uses the TcpClient class to connect to the running server, and receives the returned message.

Example 2: Implementing a client

To compile this program using mono, type the following command at your command prompt:
mcs /t:exe -out:SimpleTCPClient.exe SimpleTCPClient.cs
And to run it, type this command line:
$mono SimpleTCPClient.exe
And you’ll see the following output on your screen:

Fig 2: Result of running the SimpleTCPClient program.

viernes, 28 de abril de 2017

Utilizando la clase NpgsqlError de la enumeración NpgsqlException.Errors

Una forma precisa de diagnosticar los errores PostgreSQL en una aplicación :NET es mediante el uso de la clase NpgsqlError de la cual se pueden obtener detalles adicionales a la excepción generada esta clase esta incluida en la enumeración Errors la cual al recorrerse y consultar las propiedades de la clase NpgsqlError podemos obtener información específica acerca de los errores y advertencias que se generan al ejecutar los comandos SQL o Store procedures en PostgreSQL por medio de una aplicación .NET que haga uso del driver Npgsql.

A continuación mostramos una aplicación de consola que se conecta a una base de datos PostgreSQL, ejecuta un comando SQL para crear un nuevo registro en una tabla y envia la excepción generada hacia un archivo de texto.


Aquí el código para crear la tabla Books

Aqui el código de la clase Book


Aquí el código de la clase BooksManager


Aquí el código de la clase Logger

Finalmente, el código la clase principal MainClass.

En la clase BooksManager se encuentra el método estático LogErrors en donde se realiza toda la funcionalidad, aquí es donde se itera por la enumeración Errors de la clase NpgsqlException y se escribe la información en el archivo de texto.

Antes de compilar y ejecutar la aplicación vamos a ocasionar un error en la sentencia de la consulta SQL. Por ejemplo no escribir correctamente el nombre de la tabla.



var commandText = "INSERT INTO Booksssss(title,numpages,pubyear,created)
VALUES(:title, :numpages, :pubyear, :created)";

Al compilar y ejecutar la aplicación veremos la excepción generada a propósito para poder consultar el archivo log y ver más detalles acerca de la excepción generada.
Compilamos la aplicación con los siguientes comandos:

$ dmcs -t:library -r:System.Data,Npgsql Book.cs BooksManager.cs Logger.cs 
/out:TestNpgsqlError.dll

$ dmcs -r:TestNpgsqlError.dll Main.cs

Ejecutamos la aplicación, como se muestra en la siguiente imagen:


Otra prueba es si escribimos erróneamente los parámetros de la cadena de conexión, por ejemplo cambiar el usuario de la base de datos o no teclear correctamente el nombre de la base de datos.



string connStr = "Server=127.0.0.1;Port=5432;Database=testBooks;User ID=postgressss;
Password=Pa$$W0rd";

Podemos consultar la bitácora y ver como por cada excepción se genera un código y los detalles de la excepción.

jueves, 13 de abril de 2017

Publicación de archivos con ASP.NET en Linux y Apache con HtmlInputFile Server Control y en Windows con FileUpload Server Control

Una de las operaciones más frecuentes de las aplicaciones web (Web applications) es la carga de archivos (file upload), que es la acción donde el usuario puede seleccionar un archivo de su computadora y mediante el uso de un formulario en una página web puede transferir el archivo desde el sistema de archivos local hacia el sistema de archivos del servidor donde se encuentre la página web.

ASP .NET tiene dos formas de hacer esta funcionalidad, una mediante un control HtmlInputFile la cual se ha soportado desde el Framework 1.1 y la otra mediante un control FileUpload la cual se soporta a partir del Framework 2.0. Para este mini tutorial mostraré dos ejemplos de la implementación de la publicación de documentos con ASP .NET, el primero utilizando el control HtmlInputFile y el segundo utilizando el control FileUpload.

Fig 1. El código ASP.NET del ejemplo con un control HtmlInputFile.

Fig 2. El código C# del ejemplo con un control HtmlInputFile.


En este segundo ejemplo muestro la implementación del FileUpload server control ASP.NET (este control se encuentra disponible desde la versión 2.0 del Framework) con el siguiente código.

Fig 3. El código ASP.NET del ejemplo con server control FileUpload.

Fig 4. El código C# del ejemplo con server control FileUpload.

Para ambos casos el archivo de configuración web.config es el mismo, lo que cambia en ambos casos es el valor de la llave publishPath dentro de las etiquetas

<appSettings>
, ya que para el Ejemplo 1.0 que lo ejecutaremos en Linux utilizando Apache y Mono.
Por lo que el valor se establece en /home/martin/public_html/Downloads como se muestra en el web.config a continuación:

Fig 5. Archivo Web.config para la implementación en Apache bajo Linux

En el caso del ejemplo 2.0 lo ejecutaremos en IIS 7.0 y Windows. Por lo que el valor se establece como se muestra en el web.config a continuación:


Fig 6. Archivo web.config para la implementación en IIS

Para asignar el valor de la variable publishPath en el ejemplo 1.0 con la siguiente línea:

    string publishPath = ConfigurationSettings.AppSettings["publishPath"];
y para el ejemplo 2.0 se asigna con la siguiente línea:

    string publishPath = System.Configuration.ConfigurationManager.AppSettings["publishPath"];

Antes de ejecutar la página en Linux debemos habilitar con los permisos de escritura al directorio donde se guardaran los archivos, para hacerlo en Linux siga los siguientes pasos:

  1. El directorio donde se subiran los archivos debe tener los permisos de escritura para el grupo www.
  2. Si estamos como usuarios normales, cambiamos a una cuenta con privilegios de superusuario y establecemos y establecemos el grupo del directorio (en este ejemplo /home/martin/public_html/Downloads) como www con el siguiente comando:
                # chgrp www Downloads
            
  3. Ponemos permisos de escritura para el grupo con el siguiente comando:
                # chmod 775 Downloads
            

Estos comandos se muestran a continuación en la siguiente imagen.

Fig 7. Comandos para establecer los permisos del directorio

Ahora configuramos la Web Application dentro del archivo httpd.conf del servidor Apache como se muestra en la siguiente imagen:

Fig 8. Configuración de la Web Application en Apache

Para consultar como crear una aplicación Web en Apache revisar el siguiente documento: ASP.NET con Mono

Al ejecutar la página ASP.NET desde FireFox en Linux se mostrará como en las siguientes imágenes:

Fig 9. Seleccionando el archivo para publicar desde Firefox en Linux

Fig 10. Publicando el archivo desde Firefox en Linux

De la misma manera a como se hizo en el ejemplo anterior, antes de ejecutar la página en Windows debemos de habilitar con los permisos necesarios el directorio del servidor donde vamos a guardar los documentos, en este ejemplo la ruta configurada como directorio de publicación es C:\inetpub\wwwroot\dowloads, por lo que debemos seguir los siguientes pasos:

  1. Hacer click derecho sobre el directorio, en la ventana Properties seleccionar al usuario IIS_IUSRS (el cuál es el usuario anónimo de IIS), presionar el botón “Edit” para abrir la ventana Permissions.
    Fig 11. Seleccionando los permisos para el usuario de IIS

  2. En la ventana de Permissions en la lista inferior Permissions for IIS_IUSRS seleccionar la casilla con el permiso Write
    Fig 12. Estableciendo los permisos de escritura

Creamos la Web Application de forma que se muestre en IIS 7.0 como en la siguiente imagen:

Fig 13. Vista de la web application en IIS Manager

Al ejecutar la página ASP.NET desde Internet Explorer se verá como en las siguientes imágenes:
Fig 14. Seleccionando el archivo desde IE en Windows

Fig 15. Publicando el archivo desde IE en Windows

Un error frecuente tanto para la implementación con HtmlInputFile y FileUpload, es tratar de subir un archivo que tenga un tamaño mayor al máximo permitido por la petición al servidor Web (Request)

Fig 16. Excepción al exceder el límite máximo de la petición.

Para solucionar este error solo hay que agregar la siguiente línea al archivo de configuración, donde definimos el tamaño máximo en Kb del archivo que necesitamos publicar. Por ejemplo en el siguiente web.config se definió un tamaño máximo aproximado a 5 mbs (5120 kb).
Fig 17. El archivo web config estableciendo el tamaño máximo del archivo a publicar.


Para más información sobre este error consultar este enlace: HttpException Maximum Request Length.


domingo, 9 de abril de 2017

Threading: Programa que muestra la creación y ejecución de subprocesos.

Todos los sistemas operativos modernos permiten el uso de la concurrencia para hacer varias operaciones de manera simultánea o en paralelo, una manera actual de realizar la concurrencia es con el concepto de threads (hilos).

Un thread es un proceso ligero o un subproceso que tiene un simple flujo de control secuencial, el programa principal siempre tiene un simple flujo de control.

Un programa en C# empieza en un único Thread creado automáticamente por el CLR y el sistema operativo. Los métodos que son comúnmente utilizados por los Threads son:

  • Start: Inicia la ejecución y el hilo pasa al estado Running.
  • Suspend: Interrumpe la ejecución, puede reanudarse la ejecución si se invoca al método Resume del hilo que está en estado suspendido.
  • Sleep: Se invoca con un argumento que recibe la cantidad de milisegundos que el thread que se encuentra en estado Running debe dormir. Al terminarse este tiempo el thread vuelve al estado running
  • Resume: Reanuda la ejecución de un Thread en estado suspendido y lo pasa al estado running.

Una vez que un thread termina, no puede ser reiniciado.

Para mostrar estos conceptos escribí un programa para demostrar las técnicas básicas de creación de subprocesos llamado SimpleThreadSample, este programa crea un par de subprocesos (threads) que correrán simultáneamente dentro del thread principal del programa.

Cada subproceso corre con una prioridad normal, imprimiendo un mensaje en la consola dentro de un ciclo, invocando al método Sleep para permanecer inactivo.

El primer subproceso tendrá una inactividad de 300 milisegundos y el segundo subproceso tendrá una inactividad de 600 milisegundos.

Fig 1. El código fuente del programa

El programa crea cada subproceso con la clase ThreadStart pasando como argumento para el primer subproceso el método PrintLog10 que imprime el logaritmo del numero 10 y para el segundo subproceso el método Squared que imprime el cuadrado. Una vez creados ambos subprocesos se invoca el método Start() de cada uno de ellos, para pasarlos al estado Running.

Fig 2 la salida del programa en ejecución

Al terminar la ejecución de cada uno de los subprocesos, imprime los milisegundos que tardo en ejecutarse.

martes, 4 de abril de 2017

Trabajando con caracteres: Programa que suma el total de caracteres en un archivo de texto.

Una de las características fundamentales de cualquier lenguaje de programación es el trabajo con caracteres, todo programa fuente se compone de una secuencia de caracteres que el compilador interpreta. Como ejemplo un programa que muestra el total de coincidencias de un carácter en un archivo de texto, utilizando los métodos más usuales para convertir cadenas en arreglos de caracteres y viceversa.

Fig 1. El código del programa.

Fig 2. El programa requiere un archivo de texto.

Fig 3. El resultado de la ejecución del programa.

miércoles, 15 de marzo de 2017

Utilizando las funciones de fechas (Date functions) de SQL Server

Los cálculos con fecha son comunes en la mayoría de las aplicaciones que usan bases de datos, estos cálculos se utilizan en: fechas de vencimientos, cálculos de interés, cumpleaños o el número de días que alguien ha estado en el hospital.

Las funciones de fechas de SQL Server realizan conversiones automáticamente de los tipos CHAR o VARCHAR a los tipos DATETIME o SMALLDATETIME según sea el caso. Para mostrar ejemplos con las funciones de fecha SQL utilizare una tabla con el siguiente diseño:

Fig 1. El diseño de la tabla para los ejemplos

Algo importante que debe tenerse en cuenta, es que SQL Server trata cualquier fecha con dos dígitos en el año si son menores a 50 como años del siguiente siglo. Ejemplo:

Fig 2. Fecha de dos dígitos menor a 50 años.

Y a las fechas con los dos dígitos en el año mayores a 50 como años del siglo actual. Ejemplo:

Fig 3. Fecha de dos dígitos mayor a 50 años.

Debido a esto, para evitar problemas en las operaciones siempre es recomendable trabajar las fechas con 4 dígitos, como lo muestro en los siguientes ejemplos.

Fig 4. Fecha de cuatro dígitos menor a 50 años.

Fig 5. Fecha de cuatro dígitos mayor a 50 años.

Las funciones de fecha

Antes de trabajar con las funciones de fechas es necesario entender los componentes de los tipos de dato fecha.

Fig 6. Las partes del tipo de dato fecha.

Bien a continuación muestro los ejemplos con las funciones de fecha.

La función DATEADD

Esta función permite agregar un intervalo de tiempo a una fecha para obtener la suma del intervalo de tiempo y la fecha a la que se le aplica la función. Por ejemplo

Fig 7. Ejecutando la función para agregar 8 horas a la columna deliverydate.

La función DATEDIFF

Esta función regresa la diferencia entre dos fechas según la parte de la fecha que se especifique. Ejemplo:

Fig 8. Ejecutando la función obtener la diferencia en horas entre purchasedate y deliverydate.

La función DATENAME

Esta función regresa una cadena representando el nombre de la parte de la fecha que se especifique. Ejemplo:

Fig 9. Ejecutando la función para obtener el nombre del día de la semana y el mes del año.

La función DATEPART

Este función regresa el valor entero de la parte de la fecha que se especifique. Ejemplo:

Fig 10. Ejecutando la función para obtener el valor entero del día del año.

La función GETDATE

Esta función regresa la fecha y la hora actual del servidor. Ejemplo:

Fig 11. Obteniendo la fecha y la hora actual.

Las funciones DAY, MONTH, y YEAR

Estas funciones regresan el entero correspondiente de la fecha en la cual se aplique la función, en rigor de verdad estas funciones tienen su equivalencia con la función DATEPART, por ejemplo: la función DAY es equivalente a DATEPART(dd,fecha), la función MONTH equivale a DATEPART(mm,fecha) y así lo mismo para la función YEAR que equivale a DATEPART(yy,fecha).

lunes, 13 de febrero de 2017

Usando los controles de validación ASP.NET V (CustomValidator)

Hay ocasiones en que tenemos que comparar las entradas de los formularios con ciertos patrones que son demasiado complejos que requieren ciertas operaciones adicionales a las proporcionadas por los controles de validación predeterminados, existe también la posibilidad de usar métodos de validación previamente creadas con algún lenguaje de programación Script del lado del cliente, para estos casos .NET proporciona el control CustomValidator el cual nos permite usar funciones personalizadas tanto del lado del cliente como del lado del servidor.

Este control puede emplearse tanto del lado del servidor (Server-side) como del lado del cliente (Client-side). Para mostrar su utilización escribí dos ejemplos el primero compara las entradas del lado del servidor y el segundo hace las mismas comparaciones del lado del cliente.

Validando del lado del servidor (Server side)

El primer ejemplo muestra la utilización de este control del lado del servidor (server-side).

Fig 1. El código del control CustomValidator del lado del servidor.

Fig 2. El programa con el control CustomValidator en ejecucción.

Fig 3. El programa ejecutando las validaciones correspondientes.

Fig 4. Las validaciones requeridas fueron correctas.

Validando del lado del cliente (Client side)

El segundo ejemplo muestra las validaciones del lado del cliente (client-side), para este ejemplo es importante escribir antes que nada las funciones en JavaScript que servirán para hacer la validación, y que se utilizan en la propiedad ClientValidationFunction.

Fig 5. Las funciones JavaScript que efectuán la validación.

Fig 6. El código del control CustomValidator del lado del cliente.

Fig 7. El programa ejecutando una de las validaciones.

Fig 8. El programa ejecutando ambas validaciones.

Fig 9. El programa muestra un popup indicando que las validaciones son correctas.

Fig 10. El programa muestra un mensaje indicando que las validaciones son correctas.

La siguiente tabla muestra algunas propiedades del control.

Display

Esta propiedad tiene 3 valores

  1. Static: es la propiedad predeterminada, reserva un espacio suficiente en la página para mostrar el mensaje de error.
  2. Dynamic: el espacio para mostrar el mensaje no se reserva, cuando el mensaje se despliega se desplaza el contenido existente en la página.
  3. None: el mensaje no será desplegado en el lugar del control sino en el control ValidationSummary si se localiza en la misma página.

Errormessage

El texto del mensaje de error del control.

ControlToValidate

El control de donde obtendremos el valor para validar.

ClientValidationFunction

La función script del lado del cliente con la cual haremos la operación sobre el valor del control a validar.

OnServerValidate

El método del lado del servidor que tiene la operación que realizaremos con el valor del control

Q & A Preguntas y respuestas acerca de los sistemas de bases de datos (DBMS)

1. ¿Qué es la abstracción de datos?


2. ¿Qué hace el administrador de la base de datos?


3. ¿Cuáles son las aplicaciones de los sistemas de datos?


4. ¿Qué contiene un Diccionario de datos?


5. ¿Qué es un ejemplar de la base de datos?


6. ¿Qué es el esquema de la base de datos?


7. ¿Qué es la inconsistencia de datos?


8. ¿Qué es un lenguaje de consultas?


9. ¿Qué es un lenguaje de definición de datos?


10. ¿Qué es un lenguaje de manipulación de datos?


11. ¿Qué son los Metadatos?


12. ¿Qué es el modelo de datos orientados a objetos?


13. ¿Qué es el modelo de datos relacional?


14. ¿Qué es el Modelo de datos relacional orientado a objetos?


15. ¿Qué es un programa de aplicación?


16. ¿Qué es un sistema de gestión de base de datos?


17. ¿Qué es una transacción?


18. ¿Qué es una agregación?


19. ¿Qué es un atributo derivado?


20. ¿Qué son los atributos?


21. ¿Qué son los atributos descriptivos?


22. ¿Qué son los atributos monovalorados y multivalorados?


23. ¿Qué son los atributos simples y compuestos?


24. ¿Qué es un conjunto de entidades?


25. ¿Qué es un conjunto de relaciones?


26. ¿Qué es el conjunto de relaciones binario?


27. ¿Qué es un conjunto de relaciones recursivo?


28. ¿Qué son los conjuntos de entidades débiles y fuertes?


29. ¿Qué son los atributos discriminantes?


30. ¿Qué son las relaciones identificadoras?


31. ¿Qué es la correspondencia de cardinalidad?


32. ¿Qué es la relación uno a uno?


33. ¿Qué es la relación varios a uno?


34. ¿Qué es la relación varios a varios?


35. ¿Para que se utiliza el diagrama E-R (Entidad-relación)?


36. ¿Cuál es la diferencia entre clave candidata y clave primaria?


37. ¿Qué es el valor nulo?


Respuestas

R1. La recuperación de datos debe ser eficiente por lo que se requieren elaboradas estructuras de datos, los desarrolladores utilizan niveles de abstracción a nivel físico, lógico y de vistas para esconder la complejidad a los usuarios

R2. La persona que tiene el control central sobre el sistema de gestión de base de datos, sus tareas son: definición del esquema, definición de la estructura y del método de acceso, modificación del esquema y de la organización, concesión de la autorización para el acceso a datos y el mantenimiento rutinario.

R3. Las bases de datos son usadas en: banca, líneas áreas, universidades, transacciones de tarjetas de crédito, telecomunicaciones, finanzas, ventas, producción y recursos humanos.

R4. Un diccionario de datos contiene metadatos es decir datos acerca de los datos. El esquema de una tabla es un ejemplo de metadatos.

R5. Es la colección de la información almacenada en la base de datos en un momento en particular. Ya que las bases de datos van cambiando a lo largo del tiempo conforme la información se inserta y se borra.

R6. Es el diseño completo de la base de datos y son raramente modificados.

  • Esquema físico: El esquema físico describe el diseño físico en el nivel más bajo de abstracción, describe como se almacenan realmente los datos, las estructuras complejas de bajo nivel.
  • Esquema lógico: describe el diseño de la base de datos en un nivel más alto de abstracción, describe que datos se almacenan y que relaciones existen entre esos datos.

R7. Debido a que los archivos y programas de aplicación son creados por diferentes programadores en un largo período de tiempo, los diversos archivos tienen probablemente diferentes formatos y los programas pueden estar escritos en diferentes lenguajes. Las diversas copias de los mismos datos pueden no coincidir.

R8. Es la parte de un LMD (Lenguaje de manipulación de datos) que implica recuperación de información.

R9. Un esquema de base de datos se especifica mediante un conjunto de definiciones expresadas mediante un lenguaje especial llamado lenguaje de definición de datos.

R10. Es un lenguaje que permite a los usuarios acceder o manipular los datos organizados mediante el modelo de datos apropiado.

R11. Es decir son los datos acerca de los datos. El esquema de una tabla es un ejemplo de metadatos.

sábado, 7 de enero de 2017

Tablas de verdad con operadores lógicos de C#

El método más general para analizar los valores de verdad de las proposiciones compuestas es escribirlas en forma de una tabla. En estas tablas básicas de verdad se puede saber rápidamente si una proposición compuesta es verdadera o falsa, ya que muestra los resultados obtenidos al aplicar cada uno de los operadores lógicos, así como el resultado de la proposición de cada uno de los valores que puedan tener las diferentes proposiciones simples que integran una proposición compuesta.

Una tabla de verdad esta formada por filas y columnas, donde el número de filas depende de los posibles valores de verdad para cada proposición simple, mientras que el número de columnas depende del número de proposiciones simples que integran la proposición compuesta más el número de operadores lógicos que las conecten.

Con esto se tiene la siguiente expresión:

    Número de filas = 

En donde n es el número de proposiciones diferentes que integran una proposición compuesta y m es el número de posibles valores de verdad para cada proposición.

Como ejemplo la tabla de verdad de una contradicción, una proposición es una contradicción o absurdo si al evaluarla el resultado es falso para todos los valores de verdad. La contradicción más común es (p)^(¬p) como nos muestra su tabla de verdad.

Fig 1 Tabla de verdad de una contradicción.

A continuación la salida de un programa que muestra las tablas de verdad de los operadores lógicos y booleanos que tiene C# para formar proposiciones compuestas a partir de proposiciones simples.

Fig 2 Tablas de verdad de los operadores lógicos y booleanos en C#.

miércoles, 4 de enero de 2017

Un corto animado de Tux

La popularidad de los sistemas operativos GNU/Linux ha hecho familiar también a su mascota oficial el simpático pinguino Tux.

Pues ya hace bastante tiempo que anduvo circulando está animación en donde se ve la fascinación que tiene la oficial mascota de Linux por el pescado.

El pinguino Tux, la mascota oficial del sistema GNU/Linux.

El pinguino Tux siempre amigable como el sistema operativo que representa.