lunes, 28 de mayo de 2007

BlackHat en 3D

Alex3D [ale_galguera@yahoo.com]

En el inmenso mundo del 3D sobran formas de hacer algo como esto. A través de unos cuantos pasos aprenderemos a cómo modelar el logo de esta revista semanal (el Sombrero Negro) en 3d Studio Max 8.0, usando splines y edición de malla, levantado desde un plano superior. Esta forma de modelado es muy usada en infografías arquitectónicas más complejas, aunque en este caso nuestro plano superior no será más que dos círculos concéntricos. Espero que sirva más que de guía práctica de ejercicio para aquellos que se inician en el mundo de las X, Y y Z.

BlackHat en 3D

Antes que nada se aconseja el uso de métodos abreviados del teclado para reducir el tiempo de creación, así como trabajar con la pantalla dividida en las 4 vistas fundamentales: Perspective, Left, Top, Front). Luego comenzamos a trabajar:

1- Primero vamos al menú Create»Shapes»Circle, y creamos un círculo de radio 80. En el panel de Propiedades ponemos interpolación en 12; esto es para que al resultado final no se le vean los polígonos y cree un mejor suavizado.

2- Ahora usamos la herramienta Escalar, aunque primero nos aseguramos de que esté en modo "Escala uniforme". Seleccionamos el círculo y escalamos hacia adentro presionando Shift, sólo por los ejes X y Y. Es importante que el eje Z quede fuera de nuestra selección. Se formará un nuevo círculo y al soltar el clic nos mostrará el cuadro de opciones de clonación. Ahí pondremos el nombre al nuevo círculo y seleccionaremos Copy de las tres opciones que nos son mostradas.

3- Damos Aceptar y luego clic derecho, convertir a Editable Spline. En las propiedades de Editable Spline, clic en Attach y seleccionamos el otro círculo para que formen un solo objeto.

4- Nuevamente clic derecho. Ahora que vamos a convertir a Editable Poly, como resultado veremos cómo se rellena el espacio entre ambos círculos con malla.

5- Seleccionamos border (tecla 3) del nivel de subobjeto de la malla poly (panel Selection), ubicamos y marcamos el borde del centro (el antiguo círculo pequeño) y lo subimos un poquito por el eje Z, sólo para darle el toque semi-inclinado de las alas del sombrero.

6- En Selection»Polygon, seleccionamos toda la malla y Extruimos (con Alt + E) un poco... sólo un poco hacia arriba (eje Z)

7- Nuevamente seleccionamos border, tomamos el borde del centro (el antiguo círculo pequeño, otra vez) lo movemos por la Z hacia arriba; no mucho, sólo lo suficiente para hacer el aro de cinta negro que le da la vuelta al sombrero.

8- Volvemos a seleccionar el borde y escalamos uniformemente (ahora sí escalamos todos los ejes) hacia adentro un poco el borde, luego volvemos a tomar la herramienta de Mover y seguimos estirando el borde hacia arriba con el Shift presionado, Luego volvemos a la herramienta Escalar (de modo uniforme) y estrechamos un poco la parte alta del sombrero.

9- Seguimos trabajando en el mismo borde con la herramienta Escalar (siempre en modo uniforme) y esta vez volvemos a escalar (sólo por X y Y) hacia adentro presionando Shift de modo que se cierre lo suficiente el agujero. No importa dejar un pequeño hoyito, eso se solucionará en el el siguiente paso.

10- Ahora seleccionamos Vertex (tecla 1) y en la vista superior (T) seleccionamos los vértices que conforman el agujero pequeño de la parte superior. Luego vamos a Collapse en las propiedades de la malla Editable Poly. Volvemos a Perspectiva... ya está casi listo nuestro BlackHat.

11- Ahora vamos al suavizado, (usar vista lateral, tecla L) seleccionamos los polígonos que componen la parte superior del "hat" y, en Polygon Properties»Smoothing Groups, seleccionamos el 1 (éste es el grupo uno de suavizado).

Luego hacemos lo mismo para la cinta del sombrero poniéndolo en 2 pero además en Set ID le asignamos 2 también; lo mismo para las parte de abajo del sombrero, pero sin asignar ningún ID y poniéndolo en 3 o en 1 para que tome el mismo suavizado de la parte superior.

12- Solo faltaría texturizar, pero basta con ponerle un color gris a todo el modelo. Luego seleccionamos los polígonos que corresponden a la cinta. Para esto vamos a Select ID y ponemos 2, así recuperamos la selección hecha previamente, Luego presionamos M y le asignamos cualquiera de los materiales (esferas grises) que aparecen en el editor de materiales. Posteriormente seleccionamos el material y en Shader Basic Parameters ponemos Anisotropics en el menú desplegable. Ponemos en difusa el color Negro (en Anisotropic Basic Parameters), asignamos: Specular Level a 149, Glossiness a 25, Anisotropy a 50 y Orientation 0.

13- ¡Terminado! A los que no le guste mucho el acabado del sombrero de la parte de abajo pueden ponerle un modificador Shell, y dos o tres luces Omni, F9 (para el render) ¡y ya está! También pueden jugar con los valores de anisotropía y probar con texturas y otros materiales así como distintos tipos de luces. El resultado final, según los pasos de este texto, debe quedar más o menos igual a la primera imagen. Todo en dependencia del ángulo de la cámara y las luces.

Para saber más...

Continuar leyendo

Distribución QWERTY

ZorphDark [blackhat4all@gmail.com]

QWERTY... no se trata de una distribución GNU/Linux, sino de la posición de las primeras teclas de la fila superior que utilizó Christopher Latham Sholes en su propia máquina de escribir. Aunque el invento se remonta a 1714 -cuando la reina de Gran Bretaña otorgó un registro a Henry Mill-, el norteamericano Sholes patentó su maquinaria en Milwaukee en el año 1868 (junto a Samuel Soule y Carlos Glidden, que contribuyeron en su invento). Con el objetivo de lograr altas velocidades de escritura, ubicaron las letras del alfabeto que más se utilizaban en una sucesión continua distribuida en lados opuestos, para impedir el atascamiento producido por los viejos mecanismos. Años después, con la perfección de esta máquina, se decidió vender los derechos de distribución a la Remington Arms Company en 1872 por $12 000 dólares. Sholes y Glidden fabricaron entonces el primer modelo industrial que, teniendo casi todas las características de la máquina de escribir moderna, logró la supremacía en el mercado.

Distribución QWERTY para
computadoras

Las primeras Remington sólo escribían en mayúscula, pero en 1978 se solucionó el problema, adaptando una palanca al sistema que tenía la función de bajar el carro o retornarlo a su posición original para poder imprimir letras minúsculas. Más adelante, la "tecla doble" logró un efecto mucho más práctico, donde ambos tipos de letra estaban montados en la misma línea de linotipia. Esta tecnología permitió la adición de números y símbolos adicionales sin aumentar el tamaño del teclado.

Distribución Dvorak

Después del éxito de esta máquina, se inventaron nuevos modelos, pero ninguno pudo sobrepasar su éxito. En 1936, August Dvorak patentó una distribución distinta, asegurando que era mucho más eficiente que la QWERTY. A pesar de contar con el apoyo de muchos ergonomistas, este modelo nunca fue ampliamente adoptado. En diversas pruebas, se ha logrado velocidades similares de mecanografía para ambas distribuciones.

En la segunda mitad del siglo XX, cuando se comenzó a introducir información en los sistemas de cómputo mediante los teclados alfanuméricos, se seleccionó a la distribución QWERTY por ser la más difundida, con todas las ventajas que ello supone. Sólo se fueron agregando con el paso del tiempo algunas teclas especiales, como las de dirección, las de funciones y las de control, que agilizarían el vínculo usuario-computadora.

Hay quienes refutan el hecho de que la QWERTY tiene la mejor distribución del mercado y otros afirman que la antigua justificación de anti-atascamiento torna su velocidad a valores menores de lo estimado. Aún así, sería muy difícil alterar el adiestramiento de cientos de millones de personas que usan día a día en sus casas y oficinas la vieja distribución. Tampoco a las empresas fabriles les interesa mucho la idea de adoptar un nuevo modelo, ya que podrían fracasar como tantas otras en la historia de las máquinas de escribir. Como distribuciones alternativas, actualmente se mantienen la Dvorak y las específicas de cada idioma, pero con un ínfimo mercado en relación a la inexpugnable competidora QWERTY.

Para saber más...

Continuar leyendo

Programando para .NET, ¿Elegir VB.NET o C#?

Jesús Reina Carvajal [jesusrc@yahoo.com]

Comenzaré por afirmar: esto no es ciencia exacta. Todo código generado para .NET termina inevitablemente en MSIL, el cual es luego ejecutado por la máquina virtual de la plataforma y optimizado mientras ejecuta, lo que permite que el programa aproveche al máximo los recursos del sistema y de la máquina donde corre. Asimismo hace el programa fácilmente portable de un sistema a otro. Esta técnica ha sido copiada por Microsoft de Sun y de su comunidad Java que en esta materia llevan la delantera aunque la distancia entre los dos bandos ha disminuido considerablemente durante los últimos tres años.

Dejando Java a un lado, lo anteriormente expuesto implica que no haya diferencia alguna al elegir VB.NET o C#. Aún más: ¿por qué limitarnos solamente a C# o VB.NET? Delphi, por ejemplo, es uno de los lenguajes que compila para .NET. Las preferencias del programador son entonces las que deciden. ¿O no? En la práctica algo tan aparentemente sencillo se complica un tanto si agregamos algunos factores más. C# es el lenguaje insignia de la plataforma .NET. Así me lo dijo Johan Lindfors, evangelista de Microsoft, cuando nos encontramos por primera vez en una de las ediciones de MSDN allá por el 2002. Cuando Microsoft saca a la luz una nueva versión de su compilador C#, las novedades introducidas se verán realizadas en VB.NET luego de una versión más de la plataforma o del Visual Studio. En el mejor de los casos. Por ejemplo, la introducción de Generics en C# (Microsoft Template Library en C++ existe desde 1999) con el Visual Studio 2005 y la versión 2.0 de la plataforma .NET no permitió a los desarrolladores de Visual Basic poder utilizar de inmediato las grandes ventajas que los Generics ofrecen. Ese grupo se vio obligado a esperar la siguiente edición del Visual Studio o cambiar de lenguaje. Así de simple.

De todas maneras, ¿cuál es el mejor, C# o VB.NET? La respuesta no es exacta ni objetiva. Debido a que no soy periodista, no me veo en la obligación de ser imparcial. Revelaré que prefiero al C# desde el punto de vista sintáctico, ya que se asemeja al C/C++, los cuales domino desde hace muchos años. El no haber trabajado nunca con Visual Basic facilita aún más mi elección. El estatus de lenguaje insignia de .NET hace que mi decisión por el C# sea irrevocable. A diferencia de C# que nació con la plataforma, Delphi y VB han venido evolucionando y ajustándose a .NET y es por ello que sus sintaxis no me parecen tan limpias y elegantes como la de C#. Independientemente de todo ello, cada cual debe valorar sus preferencias, su experiencia y eventuales posibilidades de cambio de un lado hacia el otro sea cual fuere. A fin de cuentas, el hecho de escribir un programa en un determinado lenguaje no lo hace mejor que su autor. En otras palabras: un buen programador escribe buen código independientemente del lenguaje que utilice.

Para concluir mi primer artículo en esta revista ilustraré los Generics. Todo el que conoce .NET sabe bien que cualquier clase hereda del tipo base System.Object alias object. El primer ejemplo nos muestra cómo podemos crear una lista de objetos y almacenar en ella cualquier tipo, ya que todos son descendientes de object. ¡Superflexible! Peligroso a la vez. Cuando vayamos a buscar lo que tenemos almacenado, ¿cómo saber dónde tenemos un entero y donde una cadena? Podremos, pero ya tendremos que examinar el objeto almacenado. Encima de esto tenemos la "performance penalty" de In boxing y Out boxing. Toda conversión pasa por el tipo objeto, lo cual implica pérdida de tiempo en operaciones prácticamente innecesarias.

using System.Collections;
ArrayList list = new ArrayList();
list.Add(10);
//aquí hemos almacenado un entero
list.Add(Math.PI); // aquí hemos puesto el número PI
list.Add("Esto me huele mal"); // y aquí almacenamos una cadena
// justo en este caso sabemos que el primer elemento añadido es un entero
int iFromList = Convert.ToInt32(list[0]); // Out Boxing al convertir object en entero
// así como el segundo elemento es uno de tipo double
double dFromList = Convert.ToDouble(list[1]);

El siguiente ejemplo, basado en Generics, nos enseña a crear la misma lista, pero ya indicando el tipo que vamos a almacenar. Ya aquí el compilador se encargará de impedir almacenar otro tipo que no sea el que hemos prometido almacenar. Tampoco serán necesarias las conversiones de tipos, lo que hará la lista más rápida y efectiva.

using System.Collections.Generic; // aquí le prometemos al compilador que vamos a crear una lista de enteros
List<int> intList = new List<int>();
intList.Add(30);
// OK
intList.Add(-1); // OK
// la siguiente línea dará error de compilación ya que se trata de violar
// el contrato con el compilador (habíamos decidido una lista de enteros, ¿no?
// intList.Add(Math.PI);
// error de compilación al tratar de almacenar un double
// la lista nos devuelve enteros, no hay necesidad de Out Boxing
int iFromGList = intList[0]; // aquí prometemos una lista de cadenas
List<string> stringList = new List<string>();
stringList.Add("Esta es la melodía que me gusta");

Como hemos visto, los Generics ayudan a crear programas robustos con listas seguras. Su utilización no solamente está limitada a listas. Parámetros, métodos, interfaces, delegates, entre otros, son ejemplos donde los Generics pueden aportar su granito de arena en la creación y mantenimiento de sistemas de negocios, supervisión, etc.

Para saber más...

Continuar leyendo

Notas para un mejor uso del Registro de Windows

ZorphDark [blackhat4all@gmail.com]

Todo sistema operativo almacena su configuración en una zona reservada. Microsoft Windows ofrece, entre sus aplicaciones de sistema, una utilidad dedicada al mantenimiento de su propio registro de configuraciones. Bajo el nombre de "Editor del Registro", permite acceder a los parámetros de inicialización, a los perfiles de cada usuario y a la base de datos del hardware y el software instalado en el sistema.

Esta utilidad se encuentra ubicada en %systemroot%\regedit.exe y visualiza en ramas jerárquicas la estructura del registro de Windows. Se encuentra dividido en secciones lógicas -o claves-, que son nombradas según las definiciones que usa la API de Windows para referirse a ellas. Todas comienzan con HKEY, pueden contener a su vez subclaves -cuyos nombres comienzan con el de la clave padre- y son capaces de almacenar los siguientes tipos de valores:

  • REG_SZ (cadena de texto de longitud fija)
  • REG_EXPAND_SZ (cadena de texto de longitud variable)
  • MREG_MULTI_SZ (cadena de texto múltiple, cuyos valores están delimitados por un separador)
  • REG_DWORD (datos representados por un número de 4 bytes de longitud)
  • REG_BINARY (datos binarios)
  • REG_FULL_RESOURCE_DESCRIPTOR (serie de tablas anidadas, usadas para almacenar recursos)

El registro se encuentra dividido en 5 claves predefinidas:

  • HKEY_CLASSES_ROOT - Abreviada como HKCR, almacena la información correspondiente a la asociación de los programas con diferentes formatos de archivos y objetos OLE. En Windows 2000, XP, 2003 y Vista, esta clave hace referencia al contenido de HKCU\Software\Classes y HKLM\Software\Classes, priorizando los datos obtenidos de HKCU. Su contenido se guarda en %UserProfile%\Local Settings\Application Data\Microsoft\Windows\usrclass.dat en versiones basadas en NT.
  • HKEY_CURRENT_USER - Abreviada como HKCU, almacena la configuración del usuario que ha iniciado la sesión. Esta clave hace referencia a la respectiva subclave de HKU. Sus valores se encuentran almacenados en %UserProfile%\ntuser.dat para poder permitir perfiles móviles (Windows 9x utiliza el archivo C:\Windows\user.dat).
  • HKEY_LOCAL_MACHINE - Abreviada como HKLM, almacena la configuración general del sistema operativo, con efecto sobre todos sus usuarios. Las subclaves HKLM\Hardware y HKLM\System (%SystemRoot%\System32\Config\system en versiones NT y C:\Windows\system.dat en Windows 9x) guardan un registro de todos los dispositivos instalados y HKLM\Software (%SystemRoot%\System32\Config\software) mantiene registrada la configuración de todos los programas que acceden el registro. Por otra parte, HKLM\SAM (%SystemRoot%\System32\Config\sam) y HKLM\Security (%SystemRoot%\System32\Config\security) ocultan los parámetros de acceso a las cuentas de usuario, además de otros datos críticos.
  • HKEY_USERS - Abreviada como HKU, contiene las subclaves correspondientes a cada uno de los usuarios registrados del sistema. Las opciones de usuario por defecto se almacenan en %SystemRoot%\System32\Config\default y su perfil en la subcarpeta systemprofile.
  • HKEY_CURRENT_CONFIG - Abreviada como HKCC, se diferencia de las demás claves predefinidas en que ésta no es almacenada permanentemente. HKCC acumula datos en tiempo de ejecución sobre el sistema operativo, regenerando su contenido cuando se carga Windows.

De esta forma, una clave podría nombrarse de la siguiente manera:
HKEY_CURRENT_USER\Software\Proveedor\Programa\Versión\Config

Oficialmente, además del Editor de Registro, Microsoft ofrece la Herramienta de registro de consola para Windows, que puede ser ejecutada desde la línea de comandos, a través del comando REG. Contiene un conjunto de parámetros que devuelven luego de cada operación un valor booleano (0 ó 1). Pueden ser llamados de la forma: REG operación [parámetros]. Para obtener una lista de los parámetros y sus detalles, puede escribir reg en la línea de comandos o consultar su documentación.

Además, mediante los ficheros de entradas del registro, dotados de la extensión REG, se puede introducir información en el registro con el consentimiento previo de los usuarios (a partir de Windows 98). Tanto ejecutándolo en el Explorador de Windows como enviándolo con el parámetro /s de regedit.exe o import de reg.exe, puede anexar su información en cualquier clave. Por esta vía se puede automatizar el proceso, creando un archivo por lotes de MS-DOS con las instrucciones necesarias.

Aquellos lenguajes de programación que acceden directamente a la API de Windows mediante la biblioteca advapi32.dll, pueden editar las claves del registro, mediante las funciones:

RegConnectRegistry
RegCreateKey
RegCreateKeyEx
RegDeleteKey
RegOpenKey
RegOpenKeyEx
RegLoadKey
RegSaveKey
RegReplaceKey
RegRestoreKey
RegEnumKey
RegEnumKeyEx
RegFlushKey
RegCloseKey
RegUnLoadKey
RegSetKeySecurity
RegGetKeySecurity
RegQueryInfoKey
RegQueryValue
RegQueryValueEx
RegQueryMultipleValues
RegSetValue
RegSetValueEx
RegDeleteValue
RegEnumValue
RegNotifyChangeKeyValue

Un buen programa realizado en .NET, Perl, VBScript -por poner algunos ejemplos- pueden lograr mucho más que un simple archivo BAT.

En cuanto al mantenimiento, existen diversos programas que permiten escanear el registro en busca de claves duplicadas, inválidas o en desuso. TuneUp RegistryCleaner, TuneUp RegistryDefrag y RegCleaner realizan dicho trabajo a la perfección. Pero no es recomendable utilizar otros programas diferentes a Microsoft Regedit para agregar, editar o eliminar información del registro, ya que como Windows se encuentra constantemente chequeando su registro en busca de información, cualquier error o pérdida en su estructura puede ocasionar graves daños en su integridad. Por ello es necesario guardar la información valiosa en discos o particiones que no estén relacionados directamente con el núcleo del sistema. En los accesorios de la mayor parte de las versiones de Windows hay una utilidad que permite archivar copias de seguridad en dispositivos especializados o en medios de almacenamiento convencionales. Allí también se encuentra un asistente de restauración que permite recuperar la configuración válida de una fecha determinada donde Windows generó, automáticamente, una copia de seguridad de su registro y otros archivos críticos del sistema operativo.

Antes de hacer cualquier cambio en el registro se debe exportar la clave seleccionada a través del menú Archivo»Exportar en el Editor de Registro o con el comando REG EXPORT de la Herramienta de registro de consola. Siempre se debe tener la seguridad de qué se va a editar y cómo, para no alterar la configuración innecesariamente. De la misma forma, antes de ejecutar cualquier archivo de entradas del registro (*.reg), debemos abrirlo en un editor de texto para asegurarnos de que no va a causar desperfecto alguno.

Esta falta de seguridad en Windows -aunque ha sido solventada en un porciento considerable en la familia NT- se debe a la centralización del registro. La ventaja de tener toda la configuración en el disco del sistema da al traste con cualquier falla y, además, reduce la portabilidad de la mayoría de las aplicaciones instaladas en el ordenador. Hay otros sistemas operativos, como Mac OS X, que almacenan las informaciones de los programas que usan los diferentes usuarios en Library Folders, por lo que cualquier error no afectaría la totalidad del sistema.

Sólo quedaría razonar si es necesario o no acceder directamente a la base de datos del registro de Windows. Los usuarios avanzados podrán discutir sobre su fragmentación a largo plazo, las "claves basura", el ineficiente mantenimiento automático y otras desventajas que podrían tener lugar si no intervenimos por nuestra cuenta. Pero a los usuarios comunes esto no les interesa... ni siquiera les incomoda, por lo que no es recomendable que se dediquen ni siquiera a observar contenidos tan delicados. Primero debemos acceder -y estudiar- la documentación necesaria para luego sentirnos un poco más seguros de que no vamos a arruinar absolutamente nada.

Para saber más...

Continuar leyendo

C# 3.0

Krlo [blackhat4all@gmail.com]

Muchos expertos han subvalorado las mejoras de C# 3.0; aseguran que sus nuevas ofertas no son más que azúcar sintáctica. Lo cierto es que esta nueva versión es mucho más versátil y está orientada a aliviarle la vida al desarrollador, aún más que las anteriores. Con este artículo pretendo acercarlos a las principales mejoras del mismo. Algunas, por razones de espacio, serán más resumidas.

Las principales innovaciones son:

  • Variables de tipo implícito
  • Tipos Anónimos
  • Inicializadores de objetos y colecciones
  • Métodos de Extensión
  • Expresiones Lambda
  • Expresiones de Pregunta (Query Expressions)
  • Arrays de Tipo Implícito
  • Arboles de Expresión
  • Variables de tipo implicito.

Se introduce la nueva palabra clave var, la cual permite declarar nuevas variables, cuyo tipo se infiere implícitamente de la expresión usada para inicializar la variable. Ejemplo:

var i = 1;
var intArr = new[] {1,2,3,4};

Para asegurar que se cumpla en todo momento con la seguridad de tipos, C# require que se inicialice la variable después de declararla (var i; explotaría sin remedio). A esta forma de reconocer implícitamente el tipo de un objeto se le verá su extraordinario aporte más adelante.

Tipos Anonimos (TA):

C# 3.0 brinda la flexibilidad de crear instancias de una clase sin haberlas definido.

var Anon = new {hair="black", skin="green", teethCount=64};

Vendría siendo igual a:

class Anonymous1
{
  private string _hair = "black";
  private string _skin = "green";
  private int _teeth = 64;
  public string hair {get {return _hair;} set {_hair = value;}}
  public string skin {get {return _skin;} set {_skin = value;}}
  public int teeth {get {return _teeth; } set {_teeth = value; }}
}

Un inicializador de objeto anónimo declara un tipo anónimo y devuelve una instancia de ese tipo. Un tipo anónimo hereda directamente de object. Como pudimos observar, un TA es una secuencia de propiedades de lectura/escritura inferidas del inicializador o inicializadores de objeto.

El nombre de un tipo anónimo es generado automáticamente por el compilador y no puede ser referenciado en el texto del programa. Dentro del mismo programa, dos inicializadores de objetos anónimos que especifiquen una secuencia de propiedades de los mismos nombres y tipos en el mismo orden producirán instancias del mismo tipo anónimo. En concreto:

var p1 = new {Name = "Lawnmower", Price = 495.00};
var p2 = new {Name = "Shovel", Price = 26.95};
p1 = p2;
//esto es totalmente válido

Inicializadores de objetos y colecciones:

Antes:

public class CoOrdinate{
  public int x ;
  public int y;
}

Ahora podemos declarar e inicializar un objeto CoOrdinate de la siguiente manera:

var myCoOrd = new CoOrdinate{x = 0, y = 0}; //aquí se infiere hasta el tipo int de x y y.

Para trabajar con colecciones:

List<string> animals = new List<string>();
animals.Add("monkey");
animals.Add("donkey");
animals.Add("cow");
animals.Add("dog");
animals.Add("cat");

Ahora para simplificar podemos hacer:

List<string> animals = new List<string> {"monkey", "donkey", "cow", "dog", "cat"};

Esto es como un objeto List que creamos tan fácilmente como hacemos con un array de strings. Una colección se entiende en este contexto como un tipo que implementa System.Collections.Generic.ICollection<T> para exactamente una T.

Los Metodos de Extensión:

Los métodos extendidos posibilitan extender varios tipos con métodos estáticos adicionales (importante lo de estático). Sin embargo, ellos son muy limitados y deben ser usados como un último recurso, sólo cuando los métodos de instancia son insuficientes. Los métodos extendidos pueden ser declarados sólo en clases estáticas y son definidos por la palabra clave this como un modificador en el primer parámetro del método. A continuación un ejemplo de un método extendido válido:

public static int ToInt32(this string s)
{
  return Convert.ToInt32(s);
}

Si la clase estática que contiene el método antes expuesto es importada usando la palabra clave using. El método ToInt32 aparecerá en los tipos existentes (a pesar de esto es de poca preferencia con respecto a métodos de instancia existentes) y se podrá compilar y ejecutar código como el siguiente:

string s = "1";
int i = s.ToInt32();

Esto nos permite tomar ventaja de la naturaleza extensible de varios tipos internos definidos y agregar nuevos métodos al mismo. Todos los objetos tienen el método ToString(). No te gustaría que la clase String tuviera los métodos: ToInt(), ToDouble() o TodoLoQueSea(). Esta opción creo que eriza a todos los que nos gusta manosear código.

Expresiones lambda:

C# 2.0 introdujo los métodos anónimos que permitían escribir bloques de código “en línea” donde valores delegados eran esparcidos, pero la sintaxis era verbosa e imperativa. Las expresiones lambda son una forma más concisa de escribir métodos anónimos. En C# 1.x los delegados se trataban de la siguiente manera:

class Program{
  delegate void DemoDelegate();
  static void Main(string[] args) {
    DemoDelegate myDelegate = new DemoDelegate(SayHi);
    myDelegate();
  }
  void SayHi(){
    Console.Writeline("Hiya!!") ;
  }
}

En C# 2.0, usando métodos anónimos, podemos escribir lo mismo un poco más cómodo:

class Program{
  delegate void DemoDelegate();
  static void Main(string[] args){
    DemoDelegate myDelegate = delegate(){Console.Writeline("Hiya!!");};
    myDelegate() ;
  }
}

Podemos escribir expresiones lambda como una lista de parámetros, seguidos del token =>, y un bloque de expresiones o sentencias:

class Program{
  delegate void DemoDelegate();
  static void Main(string[] args){
    DemoDelegate myDelegate = () => Console.WriteLine("Hiya!!") ; //que creen.
    myDelegate();
  }
}

Las expresiones lambda ofrecen las siguientes funcionalidades adicionales:

  • Permiten que los tipos de los parámetros sean inferidos. Los métodos anónimos requerían explícitamente los tipos de sus parámetros.
  • Pueden soportar también expresiones Query.
  • Pueden ser tratadas como datos usando árboles de expresión.

Arrays de Tipos Implícitos:

La sintaxis para crear arrays se ha extendido para soportar la creación de arrays de tipo implícito.

var a = new[] {1, 10, 100, 1000}; // int[]
var b = new[] {1, 1.5, 2, 2.5}; // double[]
var c = new[] {"hello", null, "world";}; // string[]
var d = new[] {1, "one", 2, "two"}; // Error, no se puede convertir int a string o al revés.

Se atreven a combinar esta técnica con objetos anónimos:

var contacts = new[] {
  new {Name = "Krlo", PhoneNumbers = new[] {"55-55-55", "07708-73"}},
  new {Name = "Alien", PhoneNumbers = new[] {"650-555-0199"}}
};

El que no se acostumbre a escribir comentarios va a pasar trabajo. Esto, un poco más complicado, a la semana no hay Dios que lo entienda.

Expresiones de Pregunta (Query Expressions):

Esta innovación ofrece una sintaxis integrada en el lenguaje para consultas, similar a los lenguajes de consulta relacionales y jerárquicos, como SQL y XQuery. No domino bien el SQL, pero les aseguro que este punto es muy ventajoso, sobre todos para quienes trabajan con bases de datos.

Arboles de Expresión (AE):

Los Expression Trees permiten a las expresiones lambda ser representadas como estructuras de datos en lugar de código ejecutable. En otras palabras, logran que expresiones sean tratadas como datos en tiempo de ejecución. El objetivo es poder modificar y examinar expresiones lambda en tiempo de ejecución. Los AE son objetos de tipo System.Expressions.Expression<T>.

Conclusiones:

Traté de ser breve en todo momento. Espero que les haya servido de background para cuando tengan al esperado personaje. La versión final 3.0 de .NET Framework está cada vez más cerca (ya está disponible la Pre-Release). La mejora fundamental del Framework 3.0 serán las bibliotecas para programar formularios Windows Vista con estilo 3D, es decir mayor uso de las transparencias, efectos gráficos más vistosos y un mayor uso de la tarjeta gráfica. Recordar que todas estas opciones se pueden desactivar y correr un Windows Vista con aspecto "normal" pero con mejoras significativas sobre la seguridad y estabilidad.

¿Y ORCAS? El entorno de desarrollo será Visual Studio 2005, parece que Visual Studio 2007 o ORCAS tardará todavía un poco en salir e incluirá de serie las bibliotecas para trabajar con LINX, el "nuevo" lenguaje XML para datos (¿quién se embulla a hablar de LINX o Ajax en BlackHat?). Esta versión traerá soporte total para las bibliotecas WinFX (esto es como la API de Vista).

Para saber más...

Continuar leyendo

¿Estética o rapidez?

Alien [blackhat4all@gmail.com]

Los que han seguido la revista desde sus primeras publicaciones, se podrán dar cuenta que hemos hecho un gran énfasis en lo que a velocidad de conexión se trata. Mediante BlackHat les hemos hecho llegar a ustedes métodos con los que pueden mejorar la velocidad de sus enlaces con el servidor, cosa más importante para aquellos que cuentan con un módem de poca velocidad o tienen un ancho de banda más reducido que el resto.

Seguro estoy de que muchos de ustedes han tenido que pasar por el desagradable momento en que estando más apurados que nunca, entran a la red en un horario “difícil”, y tienen que esperar que el servidor deposite en caché todas y cada una de las imágenes que lleva la página a la cual están tratando de acceder, y quizás se hayan lamentado más por estos días, en los que -al menos Infomed- sin razones aparentes los desconecta, o simplemente les muestra un mensaje en el navegador con algo similar a: "Ha superado el tiempo de espera del servidor". Pero lo peor del caso es que quizás lo único que deseaban ver era cuánto de su cuenta han consumido... o buscaban una cita determinada, o cualquier otra cosa que no fuera imagen y, esperando por éstas, no pudieron o se demoraron mucho más tiempo del esperado en visualizar la página completa. Gracias a Dios la mayoría de los navegadores tienen opciones para configurar las páginas que abramos.

Quizás a muchos no les agrade la idea de limitar sus navegaciones a prescindir de las imágenes mostrando solo texto en las páginas. Puede ser que otros, que sólo buscan información, se conformen, acostumbren y prefieran una navegación rápida y segura, antes que descargar en más de 15 segundos una página por la simple razón de que quien la diseñó se le ocurrió llenarla de GIFs y animaciones innecesarias. Para ejemplificar esto les digo, tenemos a la página de Microsoft. Desde el momento en que se manda a descargar, hasta que termina se puede demorar unos 40 segundos, teniendo parte de su contenido en caché. Sin embargo, al limitar la presencia de imágenes, no llega a los 10 segundos, ¿interesante, verdad?. Además, de todas formas, es sólo una opción, un checkbox que se puede marcar y desmarcar en el momento que el usuario lo desee y luego con recargar la página, se podrán visualizar todas las imágenes que segundos antes se habían suprimido.

No puedo dedicar este artículo a explicar como desactivar las imágenes, ya que cada uno es diferente, las opciones ni son las mismas, ni están en los mismo lugares. Sólo explicare el caso de Internet Explorer, que es el más común, y el FireFox, que es el que yo utilizo.

Internet Explorer:

Para desactivar la presencia de imágenes tendrían que ir hasta Herramientas»Opciones de Internet; allí les aparece una ventanita que tiene una pestaña llamada Opciones Avanzadas. Desde allí nos dirigimos a la sección de multimedia, y desmarcamos:

  • Activar animaciones en las páginas web
  • Mostrar imágenes

También se podrían desactivar otras características, como son:

  • Reproducir sonidos en páginas web
  • Mostrar videos en páginas web

Sólo que éstas no son necesarias, ya que en Cuba, casi ninguna página contiene sonidos o videos. Sin embargo, si estamos conectándonos fuera de nuestro dominio CU, sería recomendable desmarcar estas opciones también.

Mozilla FireFox

En FireFox, para deshabilitar la presencia de las imágenes, deben ir a Herramientas»Opciones y, en la ficha Contenido, deshabilitar la opción Cargar imágenes automáticamente. Igualmente, se pueden desactivar otras como:

  • Bloquear ventanas emergentes
  • Activar JavaScriptinter
  • Activar Java

Pero, igual que en Internet Explorer, esas opciones son mas bien para los que tienen acceso a Internet.

Para saber más...

Continuar leyendo

Secretos de C++

EliuX [aorozco@infomed.sld.cu]

¿Cómo hacer que el C/C++ no me de más errores de doble declaración?

Hay un error en el mundo de la programación en C++ que se hace muy común, sobre todo cuando estamos programando orientado a objetos y tenemos distintos archivos para guardar las clases; pero cuando un archivo está incluido en 2 archivos cabecera (.h) y hay un tercero que contiene a los 2 últimos, ése puede contener clases doblemente definidas, debido a que como son muy utilizadas por otras (cómo TLista para manejar listas de elementos), éstas aparecen declaradas en las que el tercero tiene incluidas en su cabecera, por lo que el compilador da el problema de doble declaración. La situación modelada es la siguiente:

Diagrama de clases

Cómo se ve en la figura, hay tres archivos que contienen a TLista.h y un tercero (Base de Camiones) que contiene a otros dos (Camiones.h y Choferes.h), que también tienen incluido a TLista.h en su cabecera, por lo que en BaseCamiones.h estará definido 3 veces, y eso da un error. El remedio para esta situación es el siguiente:

  • Definir una variable que indique que el archivo está definido ya.
  • Usar la directiva #pragma once.

Ejemplo:

#pragma once //Cuando el compilador compila este archivo, no lo compila más cuando lo vea incluido en otros archivos, acelerando el procedimiento de compilación.
#if !defined(_VCL_ELIUX_TLISTA_HEADER_DEFINED851106_) //Si esa constante no está definida (ocurre cuando no se ha agregado todavía el archivo), entonces
#define _VCL_ELIUX_TLISTA_HEADER_DEFINED851106_ //Define la constante en el compilador (para que no se agregue más)
template<class tipo> class TLista; //Define la lista
... //Se implementa la clase
#endif

Espero que a partir de ahora no cometan más errores de este tipo ;)

¿Cómo crear errores de prevención en C/C++?

En C++ hay una directiva que permite crear un error cuando se está compilando el programa si no se cumple una condición necesaria que permite garantizar la integridad del código. Les mostraré de que se trata con un ejemplo:

#ifndef __AFXWIN_H__
#error include 'stdafx.h' before including this file for PCH
#endif

El código anterior es muy usado en Visual C++ y sirve para garantizar que antes de que se incluya el actual archivo, se añade el que contiene la directiva (en este caso stdafx.h), que contiene la definición que indica que ya se compiló ese encabezado.

Salida:
Si el compilador compila el actual archivo (el que contiene el código en vez de stdafx.h), el compilador reportará el error cómo si hubiese ocurrido un error de código y se mostrará el cartel: “include 'stdafx.h' before including this file for PCH". Empiecen a usarlo y verán cómo sus archivos no tendrán más problemas de doble declaración.

Para saber más...

Continuar leyendo

¿Quién domina Internet? (II)

ZorphDark [blackhat4all@gmail.com]

La formación del Ciberespacio

Internet fue consolidándose como una infraestructura global, que en los años ´80 comenzó a agrupar poco a poco las redes individuales existentes a lo largo y ancho del planeta. En 1985 ya era una tecnología firmemente establecida.

Un año después, el protocolo TCP/IP estaba disponible para las computadoras personales popularizadas años atrás por IBM y Macintosh. Gracias a esto y al desarrollo de las LAN (Local Area Network o Red de Área Local) y las estaciones de trabajo, la embrionaria Internet fue adquiriendo extraordinarias magnitudes. Dejó de ser un simple sistema de transferencia de documentos técnicos e información científica para convertirse en una plataforma de intercambio de información de todo tipo que fusionó los medios de comunicación existentes para dar lugar a un fenómeno sin precedentes históricos.

En 1986, la NSF (National Science Foundation o Fundación Nacional de Ciencias) comenzó a implementar su backbone (segmento de una red que aguanta el peso de todo su tráfico y conecta a su vez todas las subredes que la componen). Inspeccionar el uso que se le daba a su red era una labor colosal. Era necesario buscar un método eficaz y viable. De ahí surgió una de las primeras normas de ética de uso de las redes, que bajo el nombre de AUP (Aceptable Use Policy o Política Aceptable de Uso), prohibía el uso del backbone para fines que no contribuyeran a la investigación o educación en general. Aunque era casi imposible controlar el cumplimiento de esta norma, servía para exhortar a las personas a un uso provechoso de los servicios que brindaba la NSFnet.

La introducción de Internet en el mercado sentó sus bases cuando la NSF comenzó a darle publicidad a su red para buscar clientes comerciales. Gracias a esta estrategia, podían disminuir los costos de suscripción a sus servicios y por lo tanto, la red sería más accesible al público. El control del flujo de información comenzaba a ser incontrolable. Un ejemplo de ello fue la introducción de un virus en ARPAnet el 2 de noviembre de 1988 por Robert Tappan Morris, hijo de uno de un prestigioso experto en seguridad informática de la NSA (Nacional Security Agency o Agencia de Seguridad Nacional). La destructiva creación de este recién graduado en Ciencias de la Computación logró infectar a más de 6 000 servidores conectados a la red, dejándolos fuera de servicio por varios días. Para enfrentar este grave problema fue necesaria la creación del CERT (Computer Emergency Response Team o Grupo de Respuesta a Emergencias de Computadora).

En 1989, con la creación de la World Wide Web por Tim Berners-Lee -que hizo mucho más accesible los recursos disponibles en la red a los usuarios con pocos conocimientos de computación- y la incorporación de países de Europa, Asia y América Latina al ciberespacio, comenzó la edad de oro de la informática orientada al desarrollo de las aplicaciones y servicios de Internet.

A partir de los resultados de las estadísticas que mostraban las facilidades que brindaban las redes a la vida personal, laboral y profesional, se decidió eliminar, en 1990, la obligación de contar con el apoyo gubernamental para poder conectarse a Internet. Esto, junto al desarrollo de las actividades comerciales por Internet, permitió el incremento de 160 000 servidores enlazados en enero de ese año a la extraordinaria cifra de 5 millones en un quinquenio. Por esos días de la nueva década, ARPAnet, silenciosamente, dejaba de existir.

Con el objetivo de establecer una coherencia en el continuo desarrollo de la red de redes, se fundó en 1992 una sociedad de voluntarios llamada ISOC (Internet Society o Sociedad Internet), que mediante rigurosos análisis se dedica a definir estándares entre los elementos técnicos que rigen la estructura del ciberespacio.

En abril de 1995, luego de 8 años y medio de control, la NSF eliminó la financiación del backbone de NSFnet, terminando así con su política de privatización de la red. Esto conllevó a un proceso aún mayor de descentralización, porque con el tiempo, el backbone comenzó a dispersarse entre distintas redes regionales.

El 24 de octubre de ese mismo año, el FNC (Federal Networking Council o Concejo Federal de Redes), aceptó unánimemente una resolución que definía el término “Internet”. Lo que un día comenzó como el fruto del trabajo de un pequeño grupo de investigadores, se acordó que hace referencia a un sistema global de información que está relacionado lógicamente por un único espacio de direcciones global basado en el protocolo de Internet (IP) o en sus extensiones, es capaz de soportar comunicaciones usando el conjunto de protocolos TCP/IP o sus extensiones u otros protocolos compatibles con IP, y emplea, provee, o hace accesible, privada o públicamente, servicios de alto nivel en capas de comunicaciones y otras infraestructuras relacionadas.

La censura en Internet

Con el supuesto objetivo de hacer de Internet un lugar formal y seguro, el 1ro de febrero de 1996 el Congreso de los Estados Unidos aprobó el “Acta para la Decencia”, que anexada a una nueva ley de telecomunicaciones, censuraba todo tipo de "mensajes inapropiados" en los medios de difusión masiva. El problema surgía cuando se trataba de controlar el flujo de los mensajes por la red y se intentaba definir qué era inmoral. El modo de pensar de dos individuos que residen en regiones con culturas e ideologías diferentes no es el mismo. A la hora de tratar con información procedente de otros países surgían problemas legales. A pesar de la insistencia de Vinton Cerf en el tema, aclarando que “No es posible ni recomendable censurar a Internet”, las autoridades no prestaron mucha atención. Consecuentemente, un grupo importante de especialistas, usuarios y empresas se declararon explícitamente en contra del acta. Así quedaba demostrado que mediante ese método era prácticamente imposible controlar, de modo general, lo que las personas hacían a través de los servidores de Internet.

¿Entonces Internet es un caos?

En realidad no. Aunque no tenga un eje de control y crezca a un ritmo desmesurado que actualmente imposibilita la realización inmediata de un censo de la cantidad de servidores o sitios web publicados, Internet no es una locura. Su funcionamiento descansa en la actividad de las centenares de miles de redes que se encuentran interrelacionadas. La cantidad y la calidad de los recursos e información disponibles en Internet dependen del esfuerzo, la ética y la profesionalidad de los administradores de cada nodo.

La estructura y la operatividad de Internet pueden ser descritas mediante el sencillo ejemplo de una gran ciudad en constante crecimiento, donde cada uno de sus habitantes es responsable de sus actos, y las medidas de seguridad y control no son suficientes como para abarcarlo todo.

A pesar de su carácter descentralizado, desde hace algunos años se han puesto en práctica numerosas tecnologías que, aunque no permitan controlar efectivamente el tráfico de datos, han constituido poderosas herramientas de búsqueda y análisis de información en Internet. Un popular y adecuado ejemplo son las innovaciones de Google Inc., que se ha convertido en una de las más poderosas compañías relacionadas con el mundo de la informática, gracias a su potente buscador de recursos en la red.

Cabe destacar también los esfuerzos que están realizando algunos gobiernos -como el de los Estados Unidos- en el desarrollo de poderosas herramientas de control y vigilia del transporte de datos a través de las redes. Mediante leyes que obligan a los proveedores de acceso a Internet a entregar los registros de actividad de cada usuario, respecto a los sitios web visitados, correos enviados, etc, intentan descubrir rastros de "actividades terroristas". Claro, que aunque esto constituye una violación a los derechos de intimidad del ciudadano común e inocente, no deja de ser una utopía, ya que es prácticamente imposible registrar y revisar toda la información que fluye por todas las redes del planeta.


Densidad de población & internautas

Sobre este último hecho, es preciso decir que en la actualidad se están llevando a cabo serias investigaciones por parte de científicos y expertos para darle una forma concreta y realista al concepto Global Brain (Cerebro Global), que pretende mediante técnicas de inteligencia artificial, ordenar y dotar de razonamiento e interactividad a la red de redes con el usuario y el entorno que lo rodea.

A modo de conclusión…

Es preciso decir que en muy pocos años, la transmisión de información a grandes distancias ha pasado a ser parte inseparable de las sociedades desarrolladas. Aunque 85 de cada 100 personas en el mundo no tengan acceso a este fruto del desarrollo de la humanidad, es indiscutible que Internet forma parte de nuestro futuro. Aunque ni siquiera podamos registrar la descomunal cifra de computadoras interconectadas y recursos disponibles en la red de redes, es necesario entender los inicios de esta revolución global y de qué modo podemos dominarla. Necesariamente, entre todos tendremos que aprender a dirigir y encaminar el destino de las nuevas tecnologías de la información e impedir ser llevados hacia un futuro incierto.

Para saber más...

Continuar leyendo