viernes, 6 de noviembre de 2015

Conceptos básicos en Oracle Database

En nuestro anterior post (Configuración de la Conexión en sqldeveloper) vimos como configurar la conexión local con Oracle Database y cómo configurarla en red que es lo que a la final vamos a utilizar en entornos de producción. Antes de empezar con la temática del presente post, vamos a explicar algo que dejamos de lado en el post anterior y es la explicación de lo que representa el usuario SYS y SYSTEM en un servidor de bases de datos ORACLE.

Usuarios SYS y SYSTEM


Los usuarios SYS y SYSTEM se crean automáticamente en la instalación de Oracle DB y automáticamente reciben el rol de DBA. A continuación se muestra de manera general las funciones que cada uno tiene disponibles dentro de la base de datos.

SYS: Es el usuario con los más altos privilegios dentro de las bases de datos Oracle. Además, todas las tablas y vistas del diccionario de datos general están dentro del esquema SYS. Sin embargo, para preservar la integridad de las bases de datos ningún usuario debería modificar las tablas dentro del esquema SYS directamente, estas tareas de actualización las debería realizar únicamente la base de datos.

SYSTEM: Este usuario tiene acceso a todas las funciones del sistema excepto las siguiente:

- Backup and recovery
- Database upgrade

Todas las tareas administrativas del día a día deberían realizarse con el usuario SYSTEM, está totalmente desaconsejado utilizar el usuario SYS para tareas del día a día.

Manejo de la base de datos


A diferencia de otros motores de bases de datos no es común crear múltiples bases de datos en ORACLE. En Oracle es común hablar de esquemas de bases de datos, por ejemplo el esquema (schema) SYS que guarda toda la información relativa a la base de datos. Un esquema de base de datos (database schema) es una colección de estructuras lógicas de datos, también llamados esquemas de objetos (schema objects). Podríamos pensar que los esquemas de objetos son directamente las tablas, sin embargo, existen distintos tipos de esquemas, los más importantes son en evidencia las tablas y los índices.

SQL (Structured query language)


El lenguaje SQL fue diseñado para manejar un marco estándar de manipulación de datos en bases de datos relacionales. Todas las operaciones sobre la base de datos están basadas en lenguaje SQL, desde crear tablas hasta administrar el acceso a los objetos de la base de datos por los distintos usuarios. Oracle SQL es una implementación del estándar ANSI de SQL, e incluye muchas funcionalidades extendidas.

PL/SQL (Procedural Language/Structured Query Language)


PL/SQL es una extensión del lenguaje SQL de Oracle. PL/SQL puede utilizar todas las funciones, tipos de datos y procedimientos de SQL y además de esto controlar el flujo de un programa SQL, utilizar variables y utilizar manejadores de errores de sus procedimientos. El principal beneficio de PL/SQL es el de guardar la lógica de la aplicación dentro de la base de datos, esto se hace mediante sentencias SQL que pueden ser agrupadas como una unidad para resolver un problema específico.

Estructuras de Almacenamiento


Existen dos estructuras de almacenamiento (Database Storage Structures) en Oracle DB.

Estructura física de almacenamiento


Dentro de esta estructura tenemos tres elementos a saber. Archivos de datos (Data files), los cuales contienen la información física de los datos en la base de datos. Los datos acerca de la estructura como tables e índices son guardados en estos archivos. Archivos de control (Control files), son los que guardan información acerca de la estructura física de la base de datos (metadatos). Allí se guarda por ejemplo el nombre de la base de datos y la localización de los archivos asociados a la base de datos. Archivos de Log (Online redo log files), los cuales guardan todos los cambios realizados a los datos.

Estructura lógica de almacenamiento


En la estructura lógica encontramos en primera instancia los Bloques de datos (Data blocks), las bases de datos Oracle son guardadas por bloques que corresponden a un número específico de bytes en el disco. Por otra parte tenemos las Extensiones (Extents), los cuales son simplemente múltiples bloques de datos (data blocks) contiguos asignados para el almacenamiento de un tipo específico de información. En tercer lugar tenemos los Segmentos (Segments), los cuales son conjuntos de extensiones (extents) asignados a un objeto de usuario. Los ejemplos más importantes de segmentos son las tablas e índices, aunque también está la información deshecha e información temporal. Finalmente tenemos los Espacios de Tablas (Tablespaces). Una base de datos está dividida lógicamente en unidades llamadas tablespaces. En definición, un tablespace es un contenedor para un segmento de la base de datos, por ejemplo, tablas.

En nuestro próximo post entraremos en detalle en Oracle SQL. Hay muchas características relacionadas con la administración de bases de datos Oracle que tal vez no tocaremos pero que mencionaremos de vez en cuando. Lo importante a mi modo de ver, es hacer énfasis en uno de los aspectos más utilizado en las empresas por los administradores de bases de datos y profesionales de soluciones informáticas, el lenguaje SQL.


Referencias

- SYS and SYSTEM users. (2015, 30 September). In Oracle Help Center. Retrieved 20:00, November 5, 2015, from
- SQL. (2015, November 5). In Wikipedia, The Free Encyclopedia. Retrieved 01:12, November 7, 2015, from https://en.wikipedia.org/w/index.php?title=SQL&oldid=689169121
- Introduction to Oracle Database. (2015, September 30). In Oracle Help Center. Retrieved 01:12, November 7, 2015, from http://docs.oracle.com/database/121/CNCPT/intro.htm#CNCPT88791

miércoles, 4 de noviembre de 2015

Configuración de la conexión en sqldeveloper

En nuestro anterior post (Instalación Oracle Database) aprendimos a instalar el servidor de bases de datos Oracle Database y la herramienta SQL Developer para manejar y administrar las bases de datos Oracle. En esta ocasión veremos como configurar la conexión al servidor de bases de datos que hemos instalado.

Configuración de la Conexión Local


Lo primero que debemos hacer abrir el programa sqldeveloper que hemos instalado con anterioridad. Para crear una nueva conexión debemos dar clic en el botón verde (+) del panel de Conexión. El programa mostrará la siguiente interfaz en donde debemos colocar los datos que se presentan a continuación.



Nombre de la Conexión: Mi conexión
Usuario: SYSTEM
Contraseña: *******
Nombre del Host: localhost
Puerto: 1521
SID: xe

El nombre de la conexión puede ser cualquier nombre que podamos reconocer como identificador de la conexión. El usuario SYSTEM se crea en la instalación del motor de bases de datos al igual que la constraseña. Los últimos tres parámetros por lo general están parametrizados de forma automática. Cuando ya esté todo configurado damos clic en Probar y no debe salir ningún mensaje de error. Enseguida damos clic en Guardar y finalmente en Conectar.

Configuración del la Conexión en Red


Para configurar la conexión en red, es decir, conectarse desde el sqldeveloper a un servidor de bases de datos Oracle dentro de la misma red, debemos realizar los mismos pasos vistos para la conexión local y cambiar el host por la dirección del servidor de BD. Adicional a esto, el servidor debe tener una regla de entrada en la configuración del firewall para permitir al servicio de Oracle recibir conexiones entrantes por el puerto 1521 desde otros hosts. Entramos entonces a las configuraciones avanzadas del firewall de windows y creamos una regla de entrada para un puerto específico.



Digitamos el puerto 1521 que es el utilizado por el servidor de bases de datos Oracle DB para la conexión.



Posteriormente seleccionamos Permitir la Conexión.



Seleccionamos cuando se aplicará esta regla, por lo general, es recomendable deshabilitar las conexiones públicas y dejar solamente las privadas y redes de trabajo.



Le colocamos un nombre y descripción a la regla para poder identificarla fácilmente en posteriores ocasiones.



Finalmente verificamos que la regla esté habilitada (icono verde).



Después de esto podremos conectarnos desde cualquier host en la red a nuestros servidor. Hasta la próxima.


Referencias

- SQL Developer Concepts and Usage. (2015, 13 May). In Oracle Help Center. Retrieved 23:19, November 4, 2015, from
http://docs.oracle.com/cd/E15846_01/doc.21/e15222/intro.htm#RPTUG10000
- Agregar o editar regla de firewall. (2015). In Microsoft TechNet: Recursos para profesionales de TI. Retrieved 23:19, November 4, 2015, from https://technet.microsoft.com/es-es/library/cc753558.aspx

martes, 3 de noviembre de 2015

Instalación Oracle Database

En nuestro anterior post (Introducción a Oracle Database) tuvimos un primer acercamiento al motor de bases de datos de Oracle Corporation. Cabe recordar, que Oracle Database no es el único motor de bases de datos que maneja la empresa, a su cargo, está el desarrollo y administración de otros motores como MySQL, BerkeleyDB, TimesTen, Oracle Rdb, y Oracle NoSQL Database. El objetivo de este post, es realizar una instalación del motor Oracle Database en su última versión Express.

Instalación sobre Windows 7/8


El primer paso consiste en descargar la última versión del motor de bases de datos Oracle Database Express. Para efectos de este post, la última versión es la 11g Release 2 y es la versión sobre la cual se realizarán pruebas y se hará la instalación. Para verificar la última versión del motor puede ingresarse al siguiente enlace.


Dependiendo del sistema operativo y la arquitectura se debe descargar la versión adecuada, en este caso, se descargara la versión para Windows de 32 bits. En el caso de no tener una cuenta Oracle debe crearse, es totalmente gratuita.


Al descomprimir la carpeta del instalador se verá una carpeta llamada DISK1. Al entrar en ella se encontrará el archivo de instalación setup.exe el cuál debe ser ejecutado como administrador.


El programa hará un par de verificaciones para saber si se cumplen los requerimientos del sistema. 


Los demás pasos será cuestión de simplemente dar clic en Next. En alguna parte del proceso el programa de instalación preguntará el password que se asignará a los usuarios SYSTEM y SYS.


Al finalizar la instalación deberá visualizarse un mensaje como el siguiente.



Instalación sobre GNU/Linux


Debian 32 bits


Para instalar Oracle en distribuciones basadas en Debian, basta seguir el siguiente tutorial creado por Oracle http://www.oracle.com/technetwork/topics/linux/xe-on-kubuntu-087822.html el cual explica de manera detallada los pasos que se deben seguir para realizar una instalación satisfactoria. Para aquellos aún tiene dudas, existen básicamente dos formas rápidas en las cuales podemos realizar esta instalación.

La primera consiste en seguir el tutorial al pie de la letra y agregar el siguiente repositorio en el archivo /etc/apt/sources.list.

deb http://oss.oracle.com/debian unstable main non-free

Después de esto se deberán ejecutar los siguientes comandos

wget http://oss.oracle.com/el4/RPM-GPG-KEY-oracle -O- | sudo apt-key add -
apt-get update
apt-get install oracle-xe

Si realizando estos pasos se obtiene algún error, bien sea por la llave del apt o cualquier otro, siempre podemos descargar los paquetes directamente por http. Para esto, basta entrar y descargar todos los archivos con extensión .deb en los siguientes enlaces

https://oss.oracle.com/debian/dists/unstable/main/binary-i386/
https://oss.oracle.com/debian/dists/unstable/non-free/binary-i386/

A la fecha, son cuatro los archivos .deb que incluye la instalación de Oracle Database, los cuales deberán instalarse con el comando dpkg.

dpkg -i libaio_0.3.104-1_i386.deb oracle-xe-client_10.2.0.1-1.2_i386.deb oracle-xe-universal_10.2.0.1-1.1_i386.deb oracle-xe_10.2.0.1-1.1_i386.deb

Después de esto, es probable que el sistema arroje una alerta por la configuración de Oracle DB similar a la siguiente.



Es por esto, que finalmente debemos ejecutar el siguiente comando para correr la configuración de Oracle.

/etc/init.d/oracle-xe configure

Al ejecutar dicho comando se debería configurar algunos puertos y la contraseña de los usuarios SYS y SYSTEM. Después de esto, la consola deberá mostrarnos que Oracle DB está listo para ser utilizado. Adicional, debemos configurar algunas variables de entorno para que en adelante no tengamos problemas con el Cliente de Oracle.

En el directorio $HOME, editamos el siguiente archivo de configuración de la sessión

nano .bashrc

Justo al final, agregamos las siguientes líneas dependiendo de los directorios en donde se haya instalado la base de datos de Oracle.

export ORACLE_SID=xe
export ORACLE_BASE=/usr/lib/oracle/xe/app/oracle
export ORACLE_HOME=$ORACLE_BASE/product/10.2.0/client
export LD_LIBRARY_PATH=$ORACLE_HOME/lib

Apache también posee sus propias variables de entorno, por lo cual, debemos agregar las mismas líneas al final del archivo /etc/apache2/envvars. Este punto es muy importante ya que gracias a estas variables podremos utilizar el driver oci8 desde el entorno web.

Linux 64 bits


Descargamos la última versión de Oracle para Linux 64 bits.

http://www.oracle.com/technetwork/database/database-technologies/express-edition/downloads/index.html

Después de descargar el instalador de Oracle, descomprimimos el archivo y buscamos el .rpm que debemos instalar. Para efectos de este tutorial y la versión que hemos descargado se ha descomprimido el archivo mostrado a continuación. Para la presente versión de Oracle Database, al descomprimir el archivo .zip se crea automáticamente una carpeta llamado Disk1 en donde se encuentra el archivo que debemos instalar.



El siguiente paso consiste en generar el archivo .deb el cual es el que realmente instalaremos en distribuciones basadas en Debian. Para generarlo, debemos ejecutar el siguiente comando sobre dicho archivo.

alien -d --scripts oracle-xe-11.2.0-1.0.x86_64.rpm
La consola mostrará un mensaje para informar que el respectivo archivo .deb ha sido generado.



Después de esto, y antes de instalar el paquete debian debemos realizar algunas configuraciones previas. Dicho esto, creamos el archivo /sbin/chkconfig y agregamos el siguiente contenido.

#!/bin/bash
# Oracle 11gR2 XE installer chkconfig hack for Ubuntu
file=/etc/init.d/oracle-xe
if [[ ! `tail -n1 $file | grep INIT` ]]; then
echo >> $file
echo '### BEGIN INIT INFO' >> $file
echo '# Provides: OracleXE' >> $file
echo '# Required-Start: $remote_fs $syslog' >> $file
echo '# Required-Stop: $remote_fs $syslog' >> $file
echo '# Default-Start: 2 3 4 5' >> $file
echo '# Default-Stop: 0 1 6' >> $file
echo '# Short-Description: Oracle 11g Express Edition' >> $file
echo '### END INIT INFO' >> $file
fi
update-rc.d oracle-xe defaults 80 01
#EOF

Ahora debemos otorgar los permisos necesarios al archivo creado.

chmod 755 chkconfig

Después de esto, debemos crear el siguiente enlace simbólico.

ln -s /usr/bin/awk /bin/awk

Finalmente, editamos el archivo /etc/sysctl.conf y agregamos los siguientes parámetros del kernel.

# Oracle 11g XE kernel parameters
fs.file-max=6815744
net.ipv4.ip_local_port_range=9000 65000
kernel.sem=250 32000 100 128
kernel.shmmax=536870912
Para hacer estos cambios efectivos ejecutamos el siguiente comando.

/sbin/sysctl -p

Ahora debemos crear un grupo llamado dba con el usuario oracle. El último comando configura la contraseña para el usuario oracle.

groupadd dba
useradd -s /bin/bash -G dba -g dba -m oracle
passwd oracle

Después de esto instalamos el paquete con el comando dpkg.

dpkg --install oracle-xe_11.2.0-2_amd64.deb

A continuación se muestra el mensaje en consola que deberá salir al realizar la instalación del paquete.



Así, corremos la configuración y configuramos los parámetros solicitados.

/etc/init.d/oracle-xe configure

Al realizar la configuración de los parámetros solicitados la consula mostrará un mensaje de éxito al iniciar el servicio de la base de datos.



Por lo general la instalación de Oracle Database queda alojada en el directorio /u01, siguiendo esta premisa, se debe editar el archivo .bashrc del usuario para agregar las siguientes variables de entorno.

export ORACLE_SID=xe
export ORACLE_BASE=/u01/app/oracle
export ORACLE_HOME=$ORACLE_BASE/product/11.2.0/xe
export TNS_ADMIN=$ORACLE_HOME/network/admin
export LD_LIBRARY_PATH=$ORACLE_HOME/lib
export PATH=$PATH:$ORACLE_HOME/bin

Apache también posee sus propias variables de entorno, por lo cual, debemos agregar las mismas líneas al final del archivo /etc/apache2/envvars. Este punto es muy importante ya que gracias a estas variables podremos utilizar el driver oci8 desde el entorno web.

Finalmente, para verificar que todo ha salido como se esperaba resta entrar al SQL*Plus, o a cualquier otro programa de manejo de la base de datos como SQLDeveloper y realizar algunas consultas con el usuario SYSTEM. En una próxima ocasión veremos como instalar el Oracle Instant Client, el cual provee las librerías necesarias y SDKs para conectar con las bases de datos Oracle con distintos tipos de Software. Hasta pronto!


Referencias

- Cómo instalar Oracle Database 11g R2 Express Edition XE. (2015, Enero 2). En Tu informática fácil. Retrieved 03:42, November 4, 2015, from 
- Installing Oracle Database Software. (2012, January 01). In Oracle Real User Experience Insight Documentation. Retrieved 10:00, February 7, 2016, from
https://docs.oracle.com/cd/E26370_01/doc.121/e26358/dbinstall.htm
- ORA-09925: Unable to create audit trail file tips. (2014, November 24). In Oracle Consulting, Oracle Support and Oracle Training by BC Oracle Consulting. Retrieved 22:00, February 7, 2016, from http://www.dba-oracle.com/t_ora_09925.htm
- Specifing Initialization Parameters. (2014, November 24). En Oracle Consulting, Oracle Support and Oracle Training by BC Oracle Consulting. Retrieved 22:00, February 7, 2016, from
https://docs.oracle.com/cd/B28359_01/server.111/b28310/create005.htm
- ORA-10997: another startup/shutdown operation o... | Oracle Community. (2016, February 08). In Welcome | Oracle Community. Retrieved 21:45, February 08, 2016, from
https://community.oracle.com/thread/1135858?start=0&tstart=0
- Installing Oracle 11gXE on Mint and Ubuntu. (2011, November 26). In The Anti-Kyte | Oracle - for when it was like that when you got there. Retrieved 21:11, February 14, 2016, from
https://mikesmithers.wordpress.com/2011/11/26/installing-oracle-11gxe-on-mint-and-ubuntu/
- Installing Java, Oracle 11g R2 Express Edition and SQL Developer on Ubuntu 64-bit. (2014, March 18). In Experienced Oracle SOA / BPM & Portal professionals - Lean thinking, Agile working | Whitehorses. Retrieved 21:11, February 14, 2016, from
http://blog.whitehorses.nl/2014/03/18/installing-java-oracle-11g-r2-express-edition-and-sql-developer-on-ubuntu-64-bit/

Instalación de Java (JDK)

La mayoría de personas que han utilizado una computadora han oído hablar de Java o lo recuerdan por su símbolo de tasa de té. Alguna vez navegando en la web han tenido la necesidad de instalar el cliente de Java bien sea para ejecutar una aplicación web o de escritorio. En este post, no veremos como instalar la versión Java que conocen la mayoría de personas, en su lugar, descargaremos e instalaremos el JDK (Java Development Kit) que es el entorno de desarrollo de aplicaciones en dicho lenguaje.

Instalación de Java (JDK)


El JDK de Java permite la ejecución de aplicaciones desarrolladas en Java (JRE) y a su vez permite el desarrollo de aplicaciones aportando las librerías necesarias para compilar código hecho en Java. Para más información sobre Java puedes visitar nuestra entrada Introducción a Java. Lo primero que debemos hacer es descargarnos la última versión del JDK disponible desde el siguiente enlace:


Para efectos de este post instalaremos de manera independiente el JDK y su IDE de desarrollo NetBeans. Sin embargo, en el mismo enlace visto anteriormente se da la posibilidad de obtener el JDK y NetBeans desde un solo archivo de instalación. Hasta el momento, la última versión del JDK es la 8 update 65, para esta versión específica encontraremos el instalador en el siguiente enlace:




El primer pantallazo del instalador preparará la instalación del programa. Dependiendo de la máquina puede tardar varios minutos pasar de este paso al siguiente, lo más importante es esperar tal y como el mensaje lo anuncia.



Lo siguiente será seguir las instrucciones lo cual indica dar clic en Next en repetidas ocasiones. En algún punto de la instalación el programa mostrará la ruta donde quedarán los binarios del JDK tal y como lo muestra la siguiente imagen.



Recordar esta ruta es importante porque más adelante podremos configurar la variable PATH del sistema para ejecutar o compilar aplicaciones desde la consola de windows. Al final de la instalación deberá aparecer el siguiente mensaje.



NetBeans


NetBeans es el IDE desarrollado por Oracle para trabajar con aplicaciones hechas en Java. NetBeans al igual que Java es multiplataforma, permite el desarrollo de aplicaciones de forma modular aportando los módulos necesarios para cada caso particular. Su editor de texto provee un resaltador de sintaxis avanzado y funciones de depuración de código en tiempo real, es sin duda, una muy acertada opción.

Podemos descargar la última versión de NetBeans en el siguiente enlace:




Para desarrollar en Java es necesario descargar solamente las herramientas para Java SE y Java FX. NetBeans permite el desarrollo de otros lenguajes como PHP, C, C++ y HTML5, sin embargo, al escoger alguna de estas opciones el instalador será mucho más pesado. Al ejecutar el instalar del NetBeans deberá aparecer una ventana similar a la siguiente:



Seguimos las instrucciones del instalador hasta donde aparezca la opción voluntaria de instalar JUnit. Este programa es un framework para testear aplicaciones desarrolladas  en Java. Si nunca lo has utilizado es mejor no instalarlo por ahora y ahorrarnos ese espacio en disco que pudiere ocupar.



Más adelante y después de algunos Next aparecerá la siguiente ventana la cual mostrará el directorio en donde se ha instalado el NetBeans y el directorio de donde ha tomando el JDK. Esto debe ser transparente para el usuario, en caso de no aparecer por ejemplo el directorio del JDK podremos pensar en que no está instalado o simplemente no lo ha tomado. En dado caso debemos colocar la ruta manualmente pero esto es algo que casi nunca ocurre.



Al finalizar la instalación deberá aparecer una ventana similar a la siguiente:



Por último, al abrir el NetBeans se mostrará la interfaz principal del programa.




Referencias

- Java (programming language). (2015, November 3). In Wikipedia, The Free Encyclopedia. Retrieved 03:12, November 4, 2015, from https://en.wikipedia.org/w/index.php?title=Java_(programming_language)&oldid=688830228
- NetBeans. (2015, October 22). In Wikipedia, The Free Encyclopedia. Retrieved 03:10, November 4, 2015, from https://en.wikipedia.org/w/index.php?title=NetBeans&oldid=686984856
- JDK Installation for Microsoft Windows. (2015, April 08). In Java Plataform Standard Editions Documentation. Retrieved 03:10, November 4, 2015, from
http://docs.oracle.com/javase/8/docs/technotes/guides/install/windows_jdk_install.html#CHDEBCCJ

miércoles, 14 de octubre de 2015

Configurar Samba en Linux

Samba es una re-implementación del protocolo SMB/CIFS utilizado por Microsoft, que provee servicios compartidos de impresión y archivos en múltiples sistemas operativos. Mediante Samba, podemos asignar fácilmente permisos de acceso y/o modificación de archivos a usuarios específicos en un dominio o una misma red.

Para instalar Samba en distribuciones basadas en debian debemos utilizar el siguiente comando

apt-get install samba

Antes de configurar el Samba, debemos verificar que el equipo en donde se instale tenga un dirección local dentro de la misma red que los equipos cliente. Generalmente si se está haciendo pruebas en una máquina virtual, suele funcionar colocar el adaptador de red como anfitrión, de esta forma no estará en el mismo segmento, pero habría comunicación entre las máquinas. Si esta configuración no funciona también puede usarse NAT. Para efectos de este tutorial, se ha configurado una máquina virtual Debian, con la siguiente configuración de red.



La red local sobre la cual está el equipo cliente (Windows) es la 192.168.1.0/24. El equipo cliente tiene la siguiente configuración de red.


Al acceder dese el explorador de Windows al equipo Linux nos debe aparecer por ahora el directorio vacío.



Archivo /etc/samba/smb.conf


Para configurar el samba se debe editar el archivo /etc/samba/smb.conf. Buscamos en el archivo la zona de "Share Definitions" y nos situamos justo al comienzo de esta sección tal y como muestra el puntero en la siguiente imagen.



Agregamos la siguiente definición al archivo y guardamos los cambios.

[www]
   comment = Development directories
   browseable = yes
   writable = yes
   path = /var/www/
   valid users = develuser

Finalmente, agregamos el usuario samba y reiniciamos el servicio.

useradd -g sambashare develuser 
passwd develuser
smbpasswd -a develuser
/etc/init.d/samba restart

Después de esto, al volver a entrar desde el navegador de archivos debería aparecer la carpeta compartida.



Al dar doble click sobre ella debe aparecer un diálogo de autenticación de Windows al cual podemos acceder con el usuario y contraseña creados anteriormente. Cabe anotar, que el usuario creado tiene dos contraseñas, la primera es la contraseña propia del sistema linux y la segunda la contraseña del usuario en samba. A la final, veremos los directorios compartidos.



Hasta la próxima!.


Referencias

- Samba (software). (2015, September 22). In Wikipedia, The Free Encyclopedia. Retrieved 14:46, October 12, 2015, from https://en.wikipedia.org/w/index.php?title=Samba_(software)&oldid=682209889

sábado, 5 de septiembre de 2015

Windows Presentation Foundation

Windows Presentation Foundation (WPF) provee a los programadores un modelo unificado de programación para construir aplicaciones de escritorio con experiencias visuales realmente impresionantes. El núcleo de WPF es un motor de renderizado de resolución independiente basado en vectores, que permite aprovechar las características del hardware de gráficos moderno. Para esto, WPF incluye dentro de sus características, un lenguaje basado en XML, conocido como Extensible Application Markup Language (XAML), controles, enlace de datos, soporte para gráficos 2D y 3D, animaciones, plantillas, y muchas otras características de personalización de interfaz.

WPF es un subconjunto de .NET Framework y por lo tanto viene incluído en él y puede ser usado con lenguajes como por ejemplo Visual Basic .NET o C#. Uno de los objetivos principales de WPF es separar la presentación de la aplicación del comportamiento. Esto, se logra mediante el uso del lenguaje de marcado XAML, con el cual se crean los componentes de interfaz como diálogos, ventanas, controles de usuario, entre otros; y un lenguaje de comportamiento (code-behind) que implementa la funcionalidad a las interacciones del usuario, lo cual incluye manejo de eventos y acceso a datos.

Por lo tanto, dominar WPF implica dominar por lo menos dos tecnologías, las cuales son como se ha mencionado anteriormente XAML y un lenguaje de comportamiento (code-behind) como por ejemplo C#. Además de esto, es necesario conocer el MVVM (Model View ViewModel), el cual nos ayudará a entender mejor el proceso de interacción que se da al desarrollar aplicaciones en WPF. A continuación, presentamos un ejemplo sencillo de aplicación en WPF.

XAML


En el código de más abajo, hemos definido un elemento de tipo Window que se encarga de crear una ventana con los estilos del sistema operativo. Dentro de Window, se encuentra el elemento Button el cual tendrá asociado un evento que se disparará al dar clic sobre él. Siguiendo con el elemento Window, definimos los namespaces que engloban la app con el atributo xmlns. El atributo x:Class, define una clase en code-behind, que es la que estará vinculada al control de la ventana. Finalmente, los atributos Width y Height definen el ancho y alto de la ventana respectivamente.

<Window x:Class="SDKSample.AWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window with Button" Height="100" Width="250">

  <!-- Add button to window -->
  <Button Name="button" Click="button_Click">Click Me!</Button>
</Window>


CODE-BEHIND


Como code-behind se ha elegido C#, aunque también puede realizarse una implementación en Visual Basic .NET como se mencionó anteriomente. Lo importante del código que se presenta, sin entrar en detalles, es ver el event handler que se ha creado para el botón de la interfaz. En este caso, al hacer clic en el botón de la ventana aparecerá un mensaje del sistema con el texto “Hello, Windows Presentation Foundation!”.

using System.Windows; // Window, RoutedEventArgs, MessageBox 

namespace SDKSample
{
    public partial class AWindow : Window
    {
        public AWindow()
        {
            // InitializeComponent call is required to merge the UI 
            // that is defined in markup with this class, including  
            // setting properties and registering event handlers
            InitializeComponent();
        }

        void button_Click(object sender, RoutedEventArgs e)
        {
            // Show message box when button is clicked
            MessageBox.Show("Hello, Windows Presentation Foundation!");
        }
    }
}


Compilando en Visual Studio


Para compilar lo visto anteriormente en Visual Studio y probar el ejemplo, debemos crear un nuevo proyecto llamado SDKSample.



Al crear el proyecto por defecto se creará el contenido del archivo MainWindow.xaml y MainWindow.xaml.cs. Los contenidos de estos dos archivos deben ser reemplazados por los archivos XAML y C# definidos anteriormente.



Al final, compilamos y ejecutamos el proyecto dando clic en el ícono Start. El IDE debe mostrar un mensaje similar al que se muestra a continuación.



Hasta la próxima!.


Referencias

- Introduction to WPF (2015, Semtember). In Learn to Develop With Microsoft | MSDN. Retrived 23:09, Semptember 22, 2015 from https://msdn.microsoft.com/en-us/library/mt149842(v=vs.110).aspx?cs-save-lang=1&cs-lang=csharp
- Extensible Application Markup Language. (2015, June 7). In Wikipedia, The Free Encyclopedia. Retrieved 03:38, August 26, 2015, from https://en.wikipedia.org/w/index.php?title=Extensible_Application_Markup_Language&oldid=665911146

miércoles, 26 de agosto de 2015

Tipos de Datos y Variables en C# .NET

Los tipos de datos en C# son muy similares a los ya conocidos en Visual Basic .NET (ver Datos y variables en Visual Basic .NET). A continuación se presenta una tabla con los tipos de datos que podemos encontrar en C#.

Tipo Valores
bool True, False
byte 0-255
sbyte -128 a 127
char Símbolos Unicode utilizados en el texto
float -3,402823e38 a 3,402823e38
decimal ±1.0 × 10e−28 a ±7.9 × 10e28
double -1,79769313486232e308 a 1,79769313486232e308
short −32.768 hasta 32.767
ushort 0 hasta 65.535
int −2.147.483.648 hasta 2.147.483.647
uint 0 hasta 4.294.967.295
long −9.223.372.036.854.775.808 hasta 9.223.372.036.854.775.807
ulong 0 hasta 18.446.744.073.709.551.615
object Cualquier tipo puede almacenarse en Object
string Cualquier secuencia de caracteres

Al igual que en Visual Basic .NET, cada tipo de dato proviene de una clase que para C# está ubicada en el espacio de nombres System. Los tipos de datos descritos anteriormente se obtienen de las siguientes clases.

Tipo C# Tipo .NET Framework
bool System.Boolean
byte System.Byte
sbyte System.SByte
char System.Char
decimal System.Decimal
double System.Double
float System.Single
int System.Int32
uint System.UInt32
long System.Int64
ulong System.UInt64
object System.Object
short System.Int16
ushort System.UInt16
string System.String


Declaración e inicialización de variables


En C# podemos declarar variables escribiendo el tipo de dato, seguido del nombre de la variable tal y como se muestra en el siguiente ejemplo.

int a;

Además, podemos declarar e inicializar variables en una sola instrucción. En el siguiente ejemplo se declara una variable entera en la primera línea, se inicializa en la segunda y finalmente en la tercera línea se declara e inicializa otra variable en una sola sentencia.

int b;
b = 10;
int c = 5;

De igual forma se pueden aplicar estas sencillas reglas con cualquier otro tipo de dato.

Constantes


Para declara una constante en C# se realiza con la palabra reservada const. Además de esto, C# proporciona la palabra reservada readonly para declara una variable que solo puede ser asignada una vez en tiempo de ejecución y su valor no puede cambiar. La diferencia entre estas dos instrucciones, básicamente radica en que una constante al ser declarada e inicializada no puede cambiar su valor en tiempo de ejecución. A continuación, un ejemplo de declaración y asignación de constantes.

public const int c1 = 5;
public const double x = 1.0, y = 2.0, z = 3.0;

En la primera línea, hemos asignado a c1 el valor 5 como una constante entera. De igual forma en la segunda línea se han asignado tres constantes en la misma declaración, esta vez, de tipo double.

Enumeraciones


Las enumeraciones en C# se utilizan para agrupar constantes en un solo nombre de manera similar a como se hace en C y C++.

public enum Color
{
    Green,   //defaults to 0
    Orange,  //defaults to 1
    Red,     //defaults to 2
    Blue = 3
} 

Como se puede ver en el ejemplo anterior, se ha utilizado el nombre Color para agrupar cuatro constantes, tres de las cuales ya deben estar definidas anteriormente en el código y toman los valores correspondientes por defecto. La última constante, ha sido asignada manualmente con el valor 3. Para acceder a cualquiera de las constantes definidas en la enumeración basta con juntar el nombre de la enumeración seguida de un punto y el nombre de la constante.

Color favorite = Color.Blue;


Conversiones de Tipo


C# puede realizar conversiones de tipo de manera implícita o explicita dependiendo del contexto. Una conversión implícita luce de la siguiente forma.

int int1 = 5;
long long1 = int1;  //conversión

A continuación, se presenta una tabla que nos ayudará a determinar qué tipos de datos pueden ser convertidos a otros de manera implícita.

Tipo de origenTipo de destino
Byte
short, ushort, int, uint, long, ulong, float, double o decimal
Sbyte
short, int, long, float, double o decimal
Int
long, float, double o decimal
Uint
long, ulong, float, double o decimal
Short
int, long, float, double o decimal
Ushort
int, uint, long, ulong, float, double o decimal
Long
float, double o decimal
Ulong
float, double o decimal
Float
double
Char
ushort, int, uint, long, ulong, float, double o decimal

Las conversiones explícitas, como su nombre lo indica, declaran explícitamente la conversión de un tipo a otro.

long long2 = 5483;
int int2 = (int)long2;  // conversión

Como puede verse, para convertir explícitamente de un tipo a otro debe declararse el tipo al cual quiere convertirse entre paréntesis antes del nombre de la variable a convertir. Este es un comportamiento esperado, y es similar a lo que ocurre en otros lenguajes de programación como Java o PHP. A continuación, se presenta una tabla que nos ayudará a determinar cuándo debemos utilizar la conversión explícita.

Tipo de origenTipo de destino
Byte
sbyte o char
Sbyte
byte, ushort, uint, ulong o char
Int
sbyte, byte, short, ushort, uint, ulong o char
Uint
sbyte, byte, short, ushort, int o char
Short
sbyte, byte, ushort, uint, ulong o char
Ushort
sbyte, byte, short o char
Long
sbyte, byte, short, ushort, int, uint, ulong o char
Ulong
sbyte, byte, short, ushort, int, uint, ulong o char
Float
sbyte, byte, short, ushort, int, uint, long, ulong, char o decimal
Double
sbyte, byte, short, ushort, int, uint, long, ulong, char o decimal
Char
sbyte, byte o short
Decimal
sbyte, byte, short, ushort, int, uint, long, ulong, char, float o double

Dado que C# es un lenguaje puramente orientado a objetos, es necesario contar con las bases de la POO para tener un entendimiento claro del lenguaje. Por lo pronto, es recomendable visitar el post Introducción a la Programación Orientada a Objetos. Hasta pronto!.


Referencias

- Tipos de datos (C# y Java) (2015, August). In Learn to Develop With Microsoft | MSDN. Retrived 10:00, August 25, 2015 from https://msdn.microsoft.com/es-es/library/ms228360(v=vs.80).aspx
- Built-In Types Table (C# Reference) (2015, August). In Learn to Develop With Microsoft | MSDN. Retrived 10:00, August 25, 2015 from https://msdn.microsoft.com/en-us/library/ya5y69ds.aspx
- const (C#) (2015, August). In Learn to Develop With Microsoft | MSDN. Retrived 14:20, August 25, 2015 from https://msdn.microsoft.com/es-es/library/e6w8fe1b(v=vs.80).aspx

sábado, 22 de agosto de 2015

Tipos de Datos y Variables en Visual Basic .NET

Como en todo lenguaje de programación, existen tipos primitivos de datos con los cuales podemos representar todo tipo de información en la aplicación. Los tipos de datos que existen en Visual Basic .NET son los siguientes:

Tipo Valores
Boolean True, False
Byte 0-255 (sin signo)
SByte -128 hasta 127 (con signo)
Char Caracter simple, 0-65535 (sin signo)
Date 0001 0:00:00 - 9999 23:59:59
Decimal 0 a ±79.228.162.514.264.337.593.543.950.335 sin separador decimal,
0 a ±7,9228162514264337593543950335 con 28 lugares a la derecha del decimal,
±0,0000000000000000000000000001 (±1E−28) menor número positivo
Double −1,79769313486231570E+308 hasta −4,94065645841246544E−324 para valores negativos; 4,94065645841246544E−324 hasta 1,79769313486231570E+308 para valores positivos.
Short −32.768 hasta 32.767 (con signo)
Integer −2.147.483.648 hasta 2.147.483.647 (con signo)
UInteger 0 hasta 4.294.967.295 (sin signo)
Long −9.223.372.036.854.775.808 hasta 9.223.372.036.854.775.807 (con signo)
ULong 0 hasta 18.446.744.073.709.551.615 (sin signo)
Object Cualquier tipo puede almacenarse en Object
Single −3.4028235E+38 hasta −1.401298E−45 para valores negativos;
1.401298E−45 hasta 3.4028235E+38 para valores positivos
String Desde 0 hasta aproximadamente 2 billones de caracteres Unicode
Structure Un tipo de datos definido por el usuario desde otros tipos de componentes

Por lo general, cada tipo de datos proviene de una clase con el mismo nombre. Sin embargo, existen algunas excepciones a la regla como es el caso de los siguientes tipos .

Tipo Clase
Short Int16
UShort UInt16
Integer Int32
UInteger UInt32
Long Int64
ULong UInt64

Los tipos Structure serían de una clase definida por el usuario.

Declaración e inicialización de variables


Las variables son declaradas con la instrucción Dim seguidas del nombre de la variable, la instrucción As y finalmente el tipo de dato tal y como se muestra en el siguiente ejemplo.

Dim salario As Double
Dim nombre As String

Si las variables son del mismo tipo, la declaración puede resumirse de la siguiente forma

Dim nombre, apellidos As String

Para inicializar una variable basta con asignarle un valor según el tipo de datos con el cual se haya declarado. Por ejemplo, podemos asignar el valor "Bill Gates" a la variable nombre declarada anteriomente de la siguiente forma.

nombre = "Bill Gates"

Nótese el uso de comilla dobles en vez de comilla sencilla. Una forma abreviada para declara una variable e inicializarla al mismo tiempo es la siguiente.

Dim nombre As String = "Bill Gates"

Constantes


El uso de constantes es muy común en la mayoría de lenguajes de programación. Para declarar una constante basta con utilizar la instrucción Const seguida del nombre de la variable, la instrucción As y el tipo. Como vimos anteriormente también podemos declarar e inicializar al mismo tiempo, a continuación un ejemplo de como se haría con constantes.

Const PI As Single = 3.1416

Como buena práctica de programación es recomendable colocar el nombre de las constantes en mayúscula sostenida.

Conversiones de Tipo


En Visual Basic .NET existen dos formas para realizar una conversión de tipo de una variable a otra. La primera es la siguiente

Dim pi As Single = 3.1416
Dim intPi As Integer = pi

La conversión se realiza en la segunda línea al declarar una variable de tipo entero, que toma como argumento el valor de otra variable de otro tipo. Para este caso particular, la variable pi de tipo Single pasa a formar parte de la declaración de la variable intPi de tipo Integer, con esto, se realiza la conversión y se obtiene la asignación del valor 3.

Visual Basic .NET también cuenta con un conjunto de funciones incorporadas para realizar conversiones de tipo. Cada función y el tipo de dato de conversión se muestran en la siguiente lista.

- CBool: Boolean
- CByte: Byte
- CChar: Char
- CDate: Date
- CDbl: Double
- CDec: Decimal
- CInt: Integer
- CLng: Long
- CObj: Object
- CSng: Single
- CStr: String

A continuación podemos ver un ejemplo de cómo se utilizaría la conversión de tipos en línea tomando la variable pi del ejemplo anterior.

Console.WriteLine("El valor de PI es " + CStr(pi))

Arrays



Los Arrays son utilizados para guardar varios datos del mismo tipo en una sola variable de tamaño fijo. Pueden ser tanto unidimensionales como multidimensionales según el número de filas y columnas que posean.

Arrays unidimensionales


Para declarar un array unidimensional, basta con utilizar la instrucción Dim de la siguiente forma.

Dim arrayName(n) As DataType

En donde n es el tamaño del array, arrayName es el nombre de la variable y DataType es el tipo de datos que se guarda en el array. Podemos declarar un array y después agregar sus valores de la siguiente forma.

Dim digits(9) As Integer
digits(0) = 1
digits(1) = 2

En VB.NET como en muchos otros lenguajes de programación el primer índice de un array es cero, es por esto que en el ejemplo anterior el array digits puede contener 10 elementos y no 9. También podemos utilizar la siguiente sintaxis para inicializar un array en su declaración.

Dim digits() As Integer = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}

Arrays multidimensionales


Los arrays multidimensionales son útiles cuando la información que deseamos representar es accesible mediante índices compuestos. Por ejemplo, un punto en el plano cartesiano se compone de sus coordenadas X e Y y se representa como P(x,y). Los arrays más comunes son los de dos dimensiones que se asemejan a la estructura de una matriz o tabla y se declaran de la siguiente forma

Dim arrayName(rows, cols) As DataType

En donde rows hace referencia al número de filas y cols al número de columnas del array. En el siguiente ejemplo se declara un array de dos filas y dos columnas y se agregan sus valores.

Dim arrayName(1, 1) As Integer
arrayName(0, 0) = 1
arrayName(0, 1) = 2
arrayName(1, 0) = 3
arrayName(1, 1) = 4

De igual forma, podemos declarar e inicializar el array en una sola línea.

Dim arrayName(,) As Integer = {{1,2}, {3,4}}

En una próxima ocasión, veremos cómo iterar sobre arrays, y los Literales de matriz aninados. Hasta pronto!


Referencias

- Resumen de tipos de datos (2015, August). In Learn to Develop With Microsoft | MSDN. Retrived 10:00, August 22, 2015 from
https://msdn.microsoft.com/es-es/library/47zceaw7.aspx
- Funciones de conversión de tipos (Visual Basic) (2015, August). In Learn to Develop With Microsoft | MSDN. Retrived 10:00, August 22, 2015 from
https://msdn.microsoft.com/es-es/library/s2dy91zy.aspx
- Matrices en Visual Basic (2015, August). In Learn to Develop With Microsoft | MSDN. Retrived 10:00, August 22, 2015 from
https://msdn.microsoft.com/es-es/library/wak0wfyt(v=vs.120).aspx
- Información general sobre las constantes (Visual Basic) (2015, August). In Learn to Develop With Microsoft | MSDN. Retrived 10:00, August 22, 2015 from
https://msdn.microsoft.com/es-es/library/x2a031a0(v=vs.120).aspx

viernes, 21 de agosto de 2015

Hola Mundo! en Visual Basic .NET

El día de hoy veremos cómo imprimir nuestro primer script en Visual Basic .NET. El día de ayer vimos cómo hacer esto en el lenguaje C#, en Introduccion a C# .NET. En ambos casos, aprenderás cómo hacerlo desde consola (sin IDE) y con el entorno de Visual Studio.

Configuración Previa


Es necesario tener ya configurado un entorno de desarrollo con Microsoft Visual Studio .NET. Esto se logra si ha leído y practicado el post Introduccion a Visual Basic .NET, en donde además, se configuran los binarios del .NET Framework. Sin más preámbulo vamos a crear nuestro primer script.

Hola Mundo! sin IDE


Abrimos un bloc de notas y copiamos el siguiente código dentro de él.

Imports System

Module MyModule

   Sub Main()
      Console.WriteLine("Hola Mundo!")
      Console.ReadLine()
   End Sub

End Module

Guardamos el archivo y seleccionamos en Tipo la opción Todos los Archivos. Finalmente guardamos el archivo con el nombre HolaMundo.vb. Después de esto, abrimos una consola como administador y navegamos hasta el directorio en donde hayamos guardado el anterior archivo. Compilamos el el programa con el siguiente comando.

vbc /out:HolaMundo.exe HolaMundo.vb

Para probar el script abrimos el archivo generado (HolaMundo.exe) y observamos la salida en consola.



Hola Mundo! con IDE


Desde el Visual Studio seleccionamos "Archivo > Nuevo Proyecto" y en Plantillas buscamos Visual Basic > Windows > Windows Desktop y finalmente seleccionamos Aplicación de Consola. Al dar clic en aceptar el Visual Studio nos creará el siguiente esquema.

Imports System

Module MyModule

   Sub Main()

   End Sub

End Module

A partir de cual, debemos completar el código correspondiente según el primer ejemplo. Damos clic en Iniciar y tendremos entonces una salid por consola similar a la siguiente.



A continuación un vídeo tutorial que profundiza lo visto hoy en este post.




Referecias

- Compilar aplicaciones en consola en .NET Framework (2015, August). In Learn to Develop With Microsoft | MSDN. Retrived 22:00, August 21, 2015 from
https://msdn.microsoft.com/es-es/library/f492ca1w(v=vs.110).aspx
- Compilar y ejecutar ejemplos de código (2015, August). In Learn to Develop With Microsoft | MSDN. Retrived 22:00, August 21, 2015 from
https://technet.microsoft.com/es-es/library/ms160695(v=sql.90).aspx

Introducción a C# .NET

C# (C Sharp) es un lenguaje de programación de la plataforma Microsoft .NET, diseñado para ser simple, moderno, de propósito general y orientado a objetos. C# es un lenguaje fuertemente tipado, robusto y con un recolector de basura (Garbage Collector) que gestiona la memoria de manera eficiente. También provee soporte para internacionalización (i18n) y puede funcionar en sistema embebidos.

Configuración del entorno


Para empezar a desarrollar aplicaciones en C# debemos instalar el Framework Microsoft .NET tal y cómo se explica en el post Introduccion Microsoft .NET.html. Además de esto, es necesario configurara algunos parámetros del entorno .NET que se explican en el post Introduccion Visual Basic .NET.html. Esta última parte es importante ya que se configuran los binarios necesarios para ser ejecutados desde consola. Vamos a comenzar ahora con nuestro primer Script!, el clásico Hola mundo!.

Hola Mundo! sin IDE


Lo primero que debemos hacer es abrir un bloc de notas y escribir el siguiente código.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication1
{
   class Program
   {
      static void Main(string[] args)
      {
         Console.WrawLine("Hola Mundo!");
         Console.ReadKey();
      }
   }
}

Es aconsejable teclear el texto nosotros mismos, con esto nos ahorramos algún caracter extraño y vamos familiarizándonos con el lenguaje. Después de esto guardamos el archivo con "Archivo -> Guardar Como" y seleccionamos en Tipo la opción Todos los Archivos. Finalmente colocamos el nombre del archivo como HolaMundo.cs.

Enseguida, abrimos una consola como administrador y navegamos hasta el directorio en donde tengamos el archivo guardado. Tecleamos entonces el siguiente comando.

csc /out:HolaMundo.exe HolaMundo.cs

Al ejecutar el comando aparecerá un nuevo archivo en nuestro directorio denominado HolaMundo.exe. Finalmente al abrir dicho archivo obtenemos nuestro primer script.



Hola Mundo! con IDE


Desde el Visual Studio selecionamos "Archivo > Nuevo Proyecto" y en Plantillas buscamos C# > Windows > Windows Desktop y finalmente seleccionamos Aplicación de Consola. Al dar clic en Aceptar, el IDE nos creará el siguiente esquema.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication1
{
   class Program
   {
      static void Main(string[] args)
      {
      }
   }
}

A partir del cual, debemos completar el código tal cual está en el primer ejemplo. Damos clic en Iniciar/Start y tendremos una salida en consola similar, pero generada desde el IDE.



A continuación, se presenta un video tutorial que explica un poco más a fondo el uso del IDE y refuerza el entendimiento del primer script.



Referencias

- C Sharp (programming language). (2015, August 11). In Wikipedia, The Free Encyclopedia. Retrieved 04:41, August 21, 2015, from 
- Garbage collection (computer science). (2015, August 16). In Wikipedia, The Free Encyclopedia. Retrieved 04:42, August 21, 2015, from 
https://en.wikipedia.org/w/index.php?title=Garbage_collection_(computer_science)&oldid=676290470
- Compilar la línea de comandos con csc.exe (2015, August). In Learn to Develop with Microsoft Developer Network | MSDN. Retrieved 1:17, August 21, 2015, from
https://msdn.microsoft.com/es-es/library/78f4aasd.aspx
- Hello World, su primer programa (Guía de programación de C#) (2015, August). In Learn to Develop with Microsoft Developer Network | MSDN. Retrieved 1:17, August 21, 2015, from
https://msdn.microsoft.com/es-es/library/k1sx6ed2(v=vs.120).aspx