lunes, 18 de agosto de 2008

Confesiones

Alien [blackhat4all@gmail.com]

Confieso que me fijaba en las pruebas de matemáticas de 3ro y 4to grado, que me caía mal la jefa de aula de la secundaria y que me llevé unas cuantas papas mientras estuve en el pre y se hacia la campaña para la recogida de ese tubérculo. También confieso que esta semana tuve mi primera experiencia en un IRC, ¡Y fue impactante!.

Luego de acceder a la red por primera vez hace tan solo año y medio, gracias principalmente a h0aX, El Pika me enfrenté por primera vez a una verdadera sala de chat. La impresión fue verdaderamente sorprendente. Muchos Chat he visitado en todo este tiempo, pero la verdad es que el IRC solo se compara con el IRC.

Intro

Las siglas provienen de Internet Relay Chat y no es más que una especie de Chat al que se puede acceder mediante un programa. Para los menos entendidos, pueden ver el IRC como una especie de Hiperterminal a la que pueden acceder cientos de personas al mismo tiempo y con una rapidez que supera por mucho a la de un Chat vía web. Como todo chat, el IRC cuenta con sus moderadores, administradores, usuarios de cierto rango y usuarios rasos.

Aunque ya existen otros programas de mensajería como los jabber, la implementación de los IRC sigue siendo superior. La mayoría de los servidores jabber limitan el acceso solo a los usuarios a los que dan soporte, sin embargo a un servidor IRC se pueden conectar personas de todas las subredes (siempre y cuando el administrador de la red a la cual estamos adjuntos nos de acceso al servidor del IRC)

Toda esta historia de los IRCs se dice que comenzó por 1988 en Finlandia, mismo lugar en que se creó por Linux, solo que este último con 3 años de atraso. El origen se le atribuye a Jarkko Oikarinen, conocido dentro de los IRC como WiZ y pensado para reemplazar a MUT (MultiUser Talk, llamado OuluBox en Finlandia)

Como todo Chat establecido por un servidor, el funcionamiento y estabilidad depende de la cantidad de usuarios que estén al mismo tiempo conectados. Han existido redes inmensas capaces de dar soporte a más de 15000 (Efnet)

Para acceder a un IRC solo hará falta un programa cliente, que es quien permite y controla la comunicación entre el servidor y en usuario final. Además es necesario obtener la dirección de un servidor activo que esté dando soporte para IRC, información que está compuesta de una IP y puerto de acceso. De parte del usuario, solo deberá llenar algunos campos tales como Nombre, Nick, E-mail…

Básico

Como anteriormente dije, después de pasar 1 año y medio acostumbrado a los chat vía web, es necesario dominar algunos términos para enfrentarse al mundo de los IRC. Todo chat tiene moderadores, administradores y usuarios, solo que en los IRC estos vocabularios cambian un poco.

He aquí una pequeña lista de las palabras más comunes:
Op: Los usuarios que cuidan el canal, normalmente tienen una @ antes de su Nick y pueden ser comparados con los Moderadores de los chat por web.
Nick: Al igual que en los demás chat, con esta palabra se designa el nombre o seudónimo que adoptamos cuando estamos en la red.
Kick: Esta palabra también es muy común en los chat por web, y como en los mismos es más bien un comando que solo puede ser utilizado por los op's.
Ban: Es cuando te impiden entrar a un canal, ya sea temporal o de manera definitiva (solo los op's pueden banear)
Ircops: Son los que tienen el control absoluto de la red IRC. En los chat más habituales se vería como los que crean el chat o los que administran la web sobre la que se ha montado el chat.
Kline: Es cuando te banean pero del servidor IRC, solo los ircops pueden hacerlo.
Netsplit: Es cuando uno de los servidores conectados a la red IRC, se desprende temporalmente.
Netjoin: El servidor que se separó, regresa a la red.
Scriptz: Son complementos para el programa cliente IRC, normalmente modifican menús y brindan opciones del propio programa pero de manera mas fácil y rápida, suelen traer programas extras.
Bot: Es el que cuida a un canal, robot programado para hacer diferentes cosas dependiendo de lo que este sucediendo.
Lag: Es un retardo, ocasionado a la sobrecarga que tienen los servidores de IRC.
Canal: Es una terminología equivalente a decir sala. (Todas las salas se representan con un “#” antes del nombre)
Flood: Al igual que en todo chat, pueden aparecer personas que se dediquen a hablar boberías y sobrecargar el canal.
Clon: Es una copia que un usuario mantiene de si mismo dentro del IRC. Tiene diferente Nick pero la misma IP.
ICMP/OOB: Son 2 tipos de Nukes, se basan en aprovechar un bug del protocolo TCP/IP de Windows, consiste en mandar muchos paquetes de datos de tal manera que Windows no puede controlarlos provocando el cuelgue del sistema operativo.

Muchas “bromas” pueden ser jugadas en los IRC. La más común que se puede ver es la de un usuario tratando de ejecutar un ICMP/OOB y el otro creándose Clones. Desgraciadamente Afortunadamente eso no es posible hacerlo en nuestro país, ya que para estos ataques es necesario saber la IP de la víctima, y por lo general todos los que accedemos a la red lo hacemos a través de un proxy, siendo esta la IP que se revela.

No obstante hay otros comandos que se pueden utilizar y, aunque no nos permitan “jugar”, si podemos ya sea obtener información adicional o configurar el cliente que tengamos para que sea más a nuestra forma.

Comandos

Como hasta aquí han visto en los IRC se pueden hacer algunos truquitos más difíciles de ejecutar que en un chat común.

Todos estos comandos comienzan con una barra diagonal (/). Help, List, join, Part… no son más que palabras comunes, pero a las que, si se les antepone la barra se convierten en palabras claves que harán que el servidor se comporte de una manera específica o ejecute una acción sobre nosotros o sobre otro usuario.

Comportamiento

En mucho se semeja un IRC de un chat por web, pero en muchas cosas también suelen ser distintos y una de estas cosas es la forma de hablar. Un chat es algo un poco menos formal, algo más como… “Hola, ¿de donde eres…?”. Un IRC es algo más serio, y aunque también se puede establecer una conversación de este tipo en privado, por lo general cuando se entra a un canal se habla sobre el tema al que hace referencia el canal.

En la web, podemos ver por ejemplo en una sala de nombre “Informática” dos personas hablando de pececitos, esto es menos común en los IRC (por suerte!!)

También podemos hacer uso del riquísimo lenguaje informático para expresar emociones, estados de ánimo o simplemente para resumir palabras. Siendo así me he dedicado a recopilar algunas de estas simbologías que puedan ser de alguna utilidad para los que así deseen comunicarse.

:)    - Sonrisa clásica
;-)  - Guiñando el ojo
:(   - Triste
:D   - Risa
:O    - Gritando
[]   - Abrazos
:*   - Besos
:-I  - Indiferencia
:->  - Comentario sarcástico
[:]  - El usuario es un robot
8-)  - Uso lentes
8:-) - Es una niña
}:-) - Diablillo
:-#  - No puedo hablar!
:-&  - Se le traba la lengua
:-?  - No entiendo nada
:-Q  - Usuario es un fumador
0:-) - Es un angel
:-S  - Diciendo incoherencias
:-D  - Riéndose de ti
:-X  - Mis labios estan sellados
:-/  - Es un escéptico
*:O) - Es un payaso
X-(  - Acaba de morir
:]   - Sonrisa amiga

Continuar leyendo

Instalación del Joomla con el WAMP5

L1nk [l1nk.darck@gmail.com]

Joomla es uno de los tantos CSS utilizados para la creación rápida, fácil y sencilla de sitios webs de alto nivel. Este se basa principalmente en PHP con un sistema de plantillas, módulos y extensiones que le permiten mantenerlo actualizado, modificar su aspecto y añadirle nuevos componentes, nos permite modificar directamente el CSS o el Html, según sean las necesidades del cliente. Aquí les dejo una forma muy sencilla de configurarlo e instalarlo en un servidor web bajo Wamp5:

1) Instalar el Wamp
2) Iniciarlo y ponerlo en línea opción (Put Online)
3) En el Wamp ir a : Servicios/ My SQL/ My SQL console
4) En la consola de My SQL:
- Saldrá lo siguiente: Enter password: (aquí doy enter porque todavía no hay ningún password)
- Ahora configurare la consola con el usuario y el password que será el administrador o dueño de todas las bases de datos que se creen para eso utilizo la siguiente instrucción (l1nk se utiliza como ejemplo, en ves de colocarlo ponga su nombre):

Mysql> grant all on *.* to l1nk@localhost identified by ‘l1nk’ with grant option;

- Después cierro la consola
5) Ir a PHP Admin en c:\wamp\www\phpmyadmin
- Buscar archivo: config.inc.php
- Abrirlo con un editor de texto ( Wordpad u otro cualquiera)
- Buscar línea de comentario:

$cfg['Servers'][$i]['user'] = 'root'; // MySQL user

- Editar la línea cambiando ‘root’ por ‘l1nk’ que es el usuario creado en My SQL console.
- Buscar línea de comentario:

$cfg['Servers'][$i]['password'] =''; // MySQL password (only needed
// with 'config'auth_type)

- Editar la línea cambiando = ‘’ por =‘l1nk’ que es la clave creada en My SQL console.
- Cerrar y guardar los cambios
6) En el Wamp ir a : phpMy admin.
- Crear una base de datos nueva (esta será la base de datos donde se alojaran las tablas del joomla para diseñar mi web)
7) Ir a c:\wamp\www
- En la carpeta www creo una carpeta nueva Joomla (en ella se guardaran los archivos del Joomla)
- Busco el Joomla y extraigo los archivos en c:\wamp\www\ Joomla
- Abrir Internet Explorer Dirección: http://localhost/Joomla
- Comienzo la Instalación del Joomla:
1- Lo primero que nos aparece es la Web de instalación del Joomla comprobando la versión, instalación, seguridad y permisos de carpetas, esta parte no es de mucha importancia por lo que podemos continuar, damos siguiente.
2- Pasamos a la parte de la licencia del producto aclarando términos legales del uso del mismo. Damos en siguiente.
3- Configuración de la base de datos:

En el primer campo colocamos el nombre del servidor o se la maquina donde va a residir nuestro sitio Joomla. (Nosotros utilizaremos el de localhost valido en todas la PC)
Segundo: Nombre del usuario MySQL (en este caso seria l1nk según el ejemplo anterior)
3ero: contraseña MySQL (la misma que pusimos en la base de datos)
4to: Nombre de la base da datos MySQL (El nombre de la BD que creamos en el ejemplo para la web)
Y las demás opciones no son necesarias eso depende del uso. Damos siguiente y pasamos para la otra pagina.
4- Nombre del Sitio Web: Escribimos el nombre que recibirá nuestra web.
5- Confirmación de la URL del sitio Web, ruta física, E-Mail del administrador y permisos de los directorios/archivos:
URL: Colocamos la ruta que tendría nuestra web Ej.: http://localhost/Joomla
Ruta: La ruta local del directorio raíz de la web: c:\wamp\www\ Joomla
E-Mail: Tu correo electrónico
Contraseña: La contraseña que tendrá la administración del Sitio.
4- Se concluye la instalación solo queda borrar del directorio 'installation' de las carpetas de joomla en el directorio raíz. c:\wamp\www\ Joomla\installation

Continuar leyendo

Python como primer lenguaje de programación

Eddy [delvalle@otepr.co.cu]

Introducing Python

Python es un lenguaje interpretado de tipado dinámico multiplataforma y multiparadigma. Lo que traducido al español indica que no se compila nunca al lenguaje nativo de la computadora, es ejecutado por otro programa llamado intérprete que se encarga de hacer todo lo que le indica el programa que hemos escrito. Gracias a esta característica Python es multiplataforma, porque cuenta con intérpretes que se pueden descargar libremente para Windows, MacOS y Linux siempre lo trae instalado, ya que este lenguaje es crucial para su funcionamiento.


Lo de "tipado dinámico" indica que nunca es especifica el tipo de una variable de forma estática lo que se considera en algunos lenguajes un sacrilegio. Permitiendo hacer algo que no es posible en muchos lenguajes como C++, C# y Java. Precisamente esto:

a = 5
a = "cadena de caracteres"
a = ObjetoA()
a = ObjetoB()

La característica que le permite ser multiparadigma es que se puede programar tanto funcionalmente como orientado a objetos en Python. Pues se pueden definir clases de objetos y funciones por separado.

La cuestión del primer lenguaje

Siempre esta cuestión ha sido muy debatida en los últimos años dado que hace unos años atrás la respuesta a esta pregunta era Pascal, el cual se consideraba elegante, sencillo y soportaba el paradigma de programación estructural.

Pero hoy nos encontramos en una Babel de los lenguajes de programación, pero veamos las características que debe cumplir un lenguaje de programación para ser el primero en el aprendizaje.

Sintaxis:
El lenguaje debe tener cierto sentido de la economía en el uso de símbolos auxiliares y sus estructuras deben seguir unos principios sencillos que permitan generalizaciones efectivas. Muchos errores de programación de los aprendices se deben a la omisión o uso incorrecto de terminadores y delimitadores de bloque, como las llaves en C, C++ y Java, (que frecuentemente pasan inadvertidos al compilador por no provocar errores sintácticos o semánticos). Estos errores no siempre se deben a un mal diseño del algoritmo por parte del programador, sino al pobre soporte que ofrece el lenguaje de programación para una expresión concisa y clara del algoritmo.

Expresividad:
El lenguaje debe poder decir mucho con poco. Para ello, el lenguaje debe ofrecer estructuras de control flexibles y presentar una colección de tipos y estructuras de datos que permita expresar relaciones complejas entre datos con una notación sencilla (por ejemplo, dando soporte sintáctico a estructuras secuenciales como las listas).

Semántica:
Esta característica debe ser los más sencilla posible. Contribuye a ello que el lenguaje sea muy ortogonal, es decir, si una construcción o método funciona con una estructura de datos, debe funcionar de modo similar con aquellas otras que guardan alguna semejanza (si cierta función o método calcula la longitud de una cadena, por ejemplo, debería calcular también la longitud de una lista, pues ambas son secuencias).

Entorno de Desarrollo Integrado:
Programar es una actividad que, especialmente en fases tempranas del aprendizaje, se basa en el método de ensayo y error. Es deseable que el lenguaje vaya acompañado de un entorno de programación que facilite un ciclo de edición-ejecución rápido. Resulta crítico, además, que se detecten y señalen correctamente los errores de todo tipo (léxicos, sintácticos, semánticos estáticos y de ejecución): nada hay más frustrante para un novato que un programa dado por bueno por un compilador y que, ”inexplicablemente”, falla en la ejecución con un mensaje tan parco como “violación de segmento”, sin indicar siquiera en qué línea se produjo el error.

Las características citadas son, a mi entender, fundamentales. Un lenguaje que las presente menguadas o que no las presente en absoluto no es un buen candidato. Hay otras características que, aunque deseables, son secundarias. Entre ellas tenemos, por ejemplo, su presencia en el “mundo real”, aunque teniendo en cuenta que está fuertemente sometido al dominio de las modas y la mercadotecnia.

Python como primer lenguaje

A continuación se recoge brevemente como son cumplidas cada una de las características anteriormente mencionadas en este lenguaje.

La sintaxis de Python es extremadamente sencilla.
Veamos un ejemplo universal: "Hola mundo":
Un lenguaje como C obliga a incorporar la cabecera de una biblioteca estándar, de?nir una función principal que devuelve un valor nulo (obligatorio en C99) y a codi?car el salto de línea de una forma críptica (al menos para una persona que no ha visto un programa en su vida):

#include <stdio.h>
int main(void)
{
  printf("Hola mundo\n");
  return 0;
}

¡Quince componentes léxicos (sin contar la directiva del preprocesador)! La cosa no mejora mucho en C++ (¡y eso sin entrar en la polémica de que cada año, o casi, hay que escribir este programa "canónico" de una forma diferente!)

#include <iostream>
int main(void)
{
  std::cout << "Hola mundo" << std::endl;
}

Y en C#, resulta complicado hasta lo inverosímil:

using System;
public class HolaMundo
{
  public static void Main(string [] args)
  {
    System.WriteLine("Hola mundo");
  }
}

¿Cómo, demonios explicar a un novato que no ha visto un programa en su vida el signi?cado de cada uno de los términos sin solicitar un acto de fe tras otro?
Python va directo al grano:

print "Hola mundo"

Naturalmente, el programa "Hola mundo" no es determinante a la hora de escoger un lenguaje de programación, pero sí debería suscitar una seria re?exión acera de la excesiva e innecesaria complejidad a la que se somete a los principiantes a la programación.

No podemos desgranar todos los elementos que hacen de Python un lenguaje de sintaxis sencilla, pero si queremos destacar uno de ellos: los bloques de código se marcan con la indentación.
Aquí tenemos un ejemplo:

def f(x):
  return x**2 - 2*x - 2

def biseccion(a, b, epsilon):
  c = (a + b) / 2.0
  while f(c) != 0 and b - a > epsilon:
    if f(a)*f(c) > 0:
      a = c
    elif f(b)*f(c) > 0:
      b = c
    c = (a + b) / 2.0
  return c

print ’x =’, biseccion(0.5, 3.5, 1e-10)

Como se puede comprobar, no hay terminadores de sentencia (como el punto y coma de C/C++/Java/C#) ni marcas de inicio y ?n de bloque (como las llaves de esos mismos lenguajes). La indentación como forma de marcar bloques elimina errores propios de los lenguajes citados y que son frecuentes en los principiantes y educa en una forma elegante y bella de escribir código. Algunos de estos errores suelen ser: sentencias condicionales sin acción por añadir un punto y coma incorrecto; bucles con una sola sentencia cuando el alumno cree que hay dos o mas por omisión de llaves con un sangrado inadecuado del programa; sentencias con semántica "alterada" por usar una coma cuando corresponde un punto y coma o por omitir un punto y coma al declarar un registro antes de una función, etc.

Python es un lenguaje interpretado.
Los lenguajes interpretados permiten ciclos de desarrollo breves (edición y ejecución), que animan a los iniciados a experimentar. Python dispone de un entorno de ejecución que ayuda a detectar los errores (incluyendo aquellos que sólo se mani?estan en tiempo de ejecución) señalándolos con mensajes muy informativos.

Ofrece, además, un entorno interactivo con el que es posible efectuar pequeñas pruebas o diseñar incrementalmente las soluciones a los problemas.

La contrapartida de que se trate de un lenguaje interpretado es, obviamente, la menor velocidad de ejecución. No obstante, esta menor velocidad no resulta en absoluto importante para los programas propios de un iniciado.

Python puede considerarse pseudocódigo ejecutable.
Muchos cursos de iniciación a la programación empiezan por presentar nociones básicas con pseudo código, es decir, con un lenguaje de programación inexistente que aporta, eso sí, la flexibilidad su?ciente para expresar cómodamente algoritmos.

Al Python ser un lenguaje tipado dinámicamente. Cada dato es de un tipo determinado (a diferencia de otros lenguajes de script, como Tcl, en los que muchos tipos son, en el fondo, cadenas) y sólo se puede operar con él de formas bien de?nidas. La ventaja es que no hay que declarar variables antes de su uso.

Esto resulta de gran ayuda para el que empieza a programar: las sutiles diferencias entre declaración y de?nición, por ejemplo, se obvian en Python. Cuando se ha acostumbrado a usar variables y ha comprendido el concepto de tipo de datos, puede transitar fácilmente a C++ y entender con mayor facilidad las ventajas de la declaraciónde variables en un lenguaje compilado.

Curiosamente, quienes critican opciones como Python por no ser un lenguaje estáticamente tipado aceptan de buen grado opciones como C o C++, lenguajes en los que "todo vale" cuando se apunta a memoria. Esta característica, que resulta útil en la programación de sistemas, se presta a enorme confusión en el principiante. No es que Python evite el trabajo con punteros, al contrario, en Python toda la información se maneja vía punteros (referencias a memoria), sino que la memoria apuntada mantiene información de tipo sobre los datos almacenados, evitando problemas de acceso a ellos con tipos erróneos.

Hay una vertiente negativa en la no necesidad de declarar variables: los errores derivados de teclear incorrectamente identi?cadores de variables o de atributos de objetos. Si se comete un error al teclear el nombre de una variable o atributo en la parte izquierda de una asignación, se crea una nueva variable. El mismo problema, cuando ocurre en la parte derecha, es detectado por el entorno de ejecución, así que no resulta tan grave.

Python facilita la detección y gestión de errores mediante excepciones.
Las excepciones forman parte ya de los lenguajes de programación modernos (Java las incorporó desde el principio y C++ lo ha hecho más recientemente) y eliminan la excesiva complejidad de la detección y tratamiento de errores con lenguajes de programación que, como C, fuerzan a detectarlos con valores especiales de retorno y que no ofrecen un modelo claro de interrupción de rutinas para localizar su tratamiento en un solo punto.

Python ofrece un rico conjunto de estructuras de datos ?exibles.
El tipo lista de Python (un vector dinámico heterogéneo) permite introducir con naturalidad el concepto de secuencia y presentar los algoritmos básicos de manejo de secuencias. Que la indexación empiece siempre en 0 ayuda a dar el salto a C, C++, C# o Java. El entorno de ejecución proporciona comprobación de validez de los índices, eliminando así una de las principales fuentes de problemas de C y C++. El hecho de que las listas sean redimensionables elimina al programador la necesidad de tomar decisiones acerca de la longitud máxima de las colecciones demasiado pronto. Es el camino que ha adoptado últimamente C++ con la STL (aunque, ¿alguien se atreve a presentar la STL en las primeras semanas de formación de un programador, con todas sus sutilezas y esa sintaxis endemoniada?).

Python es un lenguaje muy ortogonal.
Una vez se ha aprendido a manejar listas, por ejemplo, se sabe manejar cadenas, ya que ambos tipos son secuenciales y presentan conjuntos de operadores con igual nombre y semántica. Además de listas y cadenas, Python ofrece tuplas (listas inmutables) y diccionarios (vectores asociativos).

Python simplifica la gestión de memoria.
El modelo de memoria de Python es sencillo: todo valor reside en el "heap" y toda variable contiene una referencia a su valor. A ello se suma un sistema de recogida automática de basura (garbage collection) que evita los punteros colgantes (dangling pointers), las fugas de memoria, las violaciones de segmento, etc. Estos errores de ejecución, habituales en lenguajes como C o C++, son difíciles de detectar y convierten el desarrollo de programas en una actividad más frustrante de lo que es razonable, especialmente para el principiante.

Python ofrece una amplísima colección de módulos (bibliotecas).
Hay módulos para cualquier actividad imaginable: escritura de CGI, gestión de correo electrónico, desarrollo de interfaces grá?cas de usuario, análisis de documentos HTML o XML, acceso a bases de datos, trabajo con expresiones regulares, etc.

No es que haya que conocer todos estos módulos (no hay tiempo); pero sí es posible conocer que existen y su aplicación por si son necesarios en un futuro.
Acostumbrarse a consultar la documentación de las bibliotecas disponibles desde bien temprano ayuda a hacer de ellos programadores e?cientes.

Una ventaja adicional de Python es, pues, que hace posible hacer programas sobre temas "modernos": CGI, análisis de texto con expresiones regulares, interfaces gráa?cos de usuario, etc.

El mecanismo de paso de parámetros es único.
Los parámetros se pasan a funciones y métodos por referencia a objeto. En la práctica, se comporta de forma similar al paso de parámetros de Java o C#: el paso de objetos básicos (de tipo escalar) se realiza con efectos similares al paso por valor y el de objetos más elaborados (vectores, diccionarios, instancias de clase, etc.) por referencia.

def parametros(a, lista):
  a += 1
  lista.append(10)
x = 1
l = [1,2,3]
parametros(x, l)
print "x no se ha modificado:", x
print "pero a l se le ha annadido el elemento de valor 10:", l

Si bien el paso de parámetros de C es más ?exible (incluye una forma de paso de parámetros por referencia basada en el paso por valor de un puntero), el comportamiento por defecto con respecto al paso de variables de tipo báasico y vectorial es análogo al de Python, haciendo sencilla la migración posterior a este lenguaje y a C++.

Python es orientado a objetos.
A diferencia de Java y C#, Python permite una programación puramente procedular. La orientación a objetos, aunque perfectamente soportada, es opcional (a menos, naturalmente, que se recurra a ciertos módulos en los que se de?nen clases). El soporte a la programación orientada a objetos es similar al de lenguajes como Smalltalk: la resolución de los nombres de método y atributos es dinámica. Ello elimina la necesidad de complicadas jerarquías de herencia (aunque Python soporta la herencia múltiple), clases virtuales e interfaces.

Cuestiones como el diseño de contenedores genéricos está también resuelta, pues el sistema de tipos dinámico ofrece la ?exibilidad su?ciente.

class Pila:
  def __init__(self, n): # Metodo constructor.
    self.index = -1
    self.buffer = [None] * n

  def push(self, value): # Apila un elemento.
    if self.index >= len(self.buffer):
      raise "Error: Pila llena."
    self.index += 1
    self.buffer[self.index] = value

  def top(self): # Consulta la cima de la pila.
    if self.index < 0:
      raise "Error: Pila vac´ia."
    return self.buffer[self.index]

  def pop(self): # Extrae la cima de la pila.
    if self.index < 0:
      raise "Error: Pila vac´ia."
    self.index -= 1
    return self.buffer[self.index+1]

p = Pila(5)
p.push(3)
p.push(2)
print p.top()
print p.pop()
print p.pop()

Python fortalece y fundamenta la escritura de software libre:
Pues que como los programas nunca son compilados, se ejecutan desde el fichero de texto que contiene su código, este siempre es entregado al usuario del programa, permitiéndole analizarlo y modificarlo así le convenga.

exit() #Cerrando.

Espero que estos sean motivos suficientes para empezar a aprender a programar y hacer lo usando Python, pues este presenta todas las características básicas para ser un buen lenguaje para adentrarse en el mundo de las instrucciones.

Continuar leyendo

Linux Hacks

leeckthor [argos@bioinfo.cu]

Leyendo los artículos de Alix me dije, bueno y por que no ayudo también a difundir el conocimiento sobre el Software Libre y me surgió la idea de escribir algunos artículos sobre como utilizar comandos y otras utilidades que hacen la vida en GNU/Linux mas tolerable, tanto a un “end user” o usuario común, como a un desarrollador o a un administrador.


No es mi intensión repetir su idea, sino hacerla de una manera diferente, siendo más explicativo, por lo que trataría un tema en cada envío. En este, que es el primero, tratare, como tema central, acerca del comando alias, pero antes voy a rápidamente explicar que es un comando Linux y como se utiliza de modo general, es decir, su sintaxis.

El Sistema Operativo (SO) GNU/Linux se puede ver como un sistema de capas de aplicaciones. La capa mas baja es la del kernel. El kernel es la aplicación más importante del SO, pues es el encargado de trabajar directamente con el hardware. Sobre el se encuentra el intérprete de comandos, Shell o consola y sobre esta se ejecutan las demás aplicaciones como son: los servicios web, ftp, correo, el entorno visual y sus aplicaciones, entre otras.

Los comandos de GNU/Linux son pequeños y sencillos programas que corren en la consola (Shell) pero que unidos brindan una gran potencia de trabajo. La sintaxis general de un comando es:
Comando -[opciones] [argumentos]

Las opciones modifican la forma en que el comando va a ejecutarse sobre los argumentos, por ejemplo, el comando para listar el contenido de una carpeta es ls (equivalente al dir del MS-DOS):
$ls -a /home/usuario/

El símbolo $ indica el promt de la consola, la opción -a indica que muestre también los archivos ocultos de la carpeta /home/usuario/. Si además queremos que nos muestre los permisos y los dueños de los archivos y que se muestren diferenciados por colores, las carpetas (azules), los archivos ejecutables (verdes), los archivos especiales (rojos, cyans y amarillos, en dependencia del tipo), entonces tendremos que utilizar las opciones -l y --color=auto. El comando seria:
$ls -a -l --color=auto /home/usuario/

Pero seria tedioso tener que escribir toda esa línea otra vez y a veces tener que recordar todas las opciones puede dar sus dolores de cabeza por lo que utilizar el comando alias es una buena solución a estos problemas. Este comando permite dar un nombre alternativo a un grupo de comandos con sus parámetros y sus sintaxis es:
alias nombre-alias='comandos parámetros'
se utilizan las comillas simples ' o las dobles ”

Veamos un ejemplo:
$alias ls='ls -a -l --color=auto'
entonces ahora al ejecutar en la consola
$ls /home/usuario/
estariamos ejecuntando en realidad
$ls -a -l --color=auto /home/usuario/
El comando ls sin alias
El comando ls utilizando el alias ls=' ls -l --color=auto'
Si ya no queremos utilizar ese alias pues escribimos
$unalias ls
y ls vuelve a hacer el mismo de siempre.
Para conocer los alias que estan creados solamente ejecutamos alias:
$alias
Lo malo de crear los alias desde una terminal (consola) es que solo sera valido en ella. Para que se puedan utilizar siempre, debemos ponerlos en el archivo .bashrc que se encuentra en el “home” del usuario. En el próximo árticulo hablare de ese archivo y de otros necesarios para trabajar en la consola.
Ahora les dejo varios alias que pueden agregar al archivo .bashrc (el carácter # indica que esa línea es un comentario):
# lista los archivos y carpetas con sus permisos, dueños, tamaños y ordenados por el tamaño en orden descendente.
alias ll='ls -lhS'
# muestra el dia en el formato “dia_de_la semana tab dia_del_mes mes año”
#ejemplo: sábado 16 agosto 2008
alias dia='date +"%A%t%d %B %Y"'
# muestra la hora en el formato “hora_de_0_a_12:minutos_de_00_a_59:pm/am”
#ejemplo: 8:02 pm
alias hora='date +%l:%M%P'
# descomprime los archivos *.tar.gz (comprimidos con gzip)
# ejemplo: tarz archivo.tar.gz
alias tarz='tar -xzvf'
# descomprime los archivos *.tar.bz2 (comprimidos con bzip2)
# ejemplo: tarb archivo.tar.bz2
alias tarb='tar -xjvf'
# instalar paquetes
# ejemplo: instalar k3b
alias instalar='sudo apt-get install'
# busca paquetes
# ejemplo: buscar gnome*
alias buscar='sudo apt-cache search'

Continuar leyendo

Tiempo de ejecución (Parte 1)

CHenry [chenry@lab.matcom.uh.cu]

Siempre un tema de gran inquietud es el tiempo de ejecución de nuestras aplicaciones aunque en los últimos tiempos se ha optado por no prestar atención a este aspecto ya que el hardware actual facilita este aspecto pero siempre es importante tener en cuenta este aspecto, para los que no lo están teniendo en cuenta aquí les va algo para que reflexionen. Al intentar abordar la solución de un problema computacionalmente tenemos siempre la disyuntiva de seleccionar entre varios algoritmos, el que resulte más conveniente, y dicha elección se realiza basándose en los siguientes aspectos, fundamentalmente:

Algoritmo fácil de:
Entender (claridad)
Codoficar
Depurar
VS Algoritmo que se ejecute con
la mayor rapidez posible.
Haciendo uso eficiente de los
recursos de la máquina.

Lograr uno de estos objetivos, generalmente, implica entrar en contradicción con el cumplimiento del otro, por ello, debemos valorar los casos en que se debe priorizar, uno o el otro.

El primero, referido a la claridad, es importante cuando el programa será usado, pocas veces. En tal caso, el tiempo de programación será mayor que el costo de ejecución del programa y por tanto, debemos centrar nuestra atención en optimizar la escritura del programa. Por el contrario, ante un problema cuya solución se va a utilizar muchas veces, debemos centrar nuestra atención en optimizar el tiempo de ejecución del programa, y en este caso, el costo de ejecución del mismo será mayor que el tiempo de programación.

Medición del tiempo de ejecución de un programa.

El tiempo de ejecución de un programa depende de los siguientes factores:

  • DATOS de entrada al algoritmo.
  • Calidad del código objeto generado por el COMPILADOR.
  • Naturaleza y rapidez de las instrucciones de máquina empleadas en la ejecución del programa (PROCESADOR).

El hecho de que el tiempo de ejecución dependa de la entrada, implica que el tiempo de ejecución debe definirse como una función de dicha entrada. Al referirnos a tal dependencia no solo nos referimos al tipo de dato, sino también, al “tamaño” de la entrada que es equivalente a hablar de la longitud de la misma, o sea, a la cantidad de datos de una entrada en específico.

T(n) es la forma de referirnos a una función, cuyo valor es aproximado, al tiempo de ejecución de un programa con una entrada de tamaño n.

Decimos aproximado, pues el cálculo del tiempo de ejecución no puede ser exacto, ya que para un mismo programa, este varía en función de diversos factores técnicos referidos al dispositivo de cómputo donde este se ejecute, así como a determinados elementos de SW.

T(n) se puede definir como el número de operaciones elementales ejecutadas en una computadora idealizada, pues el tiempo requerido para ejecutar una operación específica, varía entre las diferentes configuraciones de HW.
A partir de esta definición, no se utilizan unidades específicas para referirnos al tiempo de ejecución de un programa

En algunos casos, el tiempo de ejecución es una función que depende de las entradas específicas y no solo del tamaño de ellas.
Ejemplo: En un algoritmo de ordenación concreto, no es el mismo tiempo de ejecución para cuando los elementos a ordenar vienen completamente desordenados que cuando vienen casi ordenados

El tiempo de ejecución de un programa puede verse puntualmente, referido a cualquiera de estos tres casos y considerando un tamaño determinado de la entrada:

  • Caso Peor: Situación en que el algoritmo ejecuta la mayor cantidad de operaciones para resolver el problema
  • Caso Promedio: Promedio de operaciones a ejecutar para resolver el problema considerando todas las entradas posibles para un tamaño de la entrada específico.
  • Caso Mejor: Situación ideal en la que el algoritmo realiza el menos número de instrucciones para resolver el problema.

Ejemplo:
Problema: Buscar la posición de un elemento en un arreglo de tamaño n, sabiendo que el mismo ya está en dicho arreglo

BUSCAR(int[ ] A, int x)
{

  for i=1 to A.Lenght          costo de esta instrucción c1
  If (A[i] = x) return i         costo de la evaluación c2. costo de retornar valor c3
}

T(n) = (C1 + C2)t + C3

Donde t, es la cantidad de veces que se ejecuta el ciclo, tÎ {1..n} y coincide con la posición del arreglo donde se encuentra el elemento. n es la longitud del arreglo.
En este ejemplo, T(n) depende del tamaño de la entrada, especialmente, de la posición donde está el elemento que se busca

Caso mejor, cuando t = 1
Caso peor, cuando t = n
Caso promedio, cuando t = (n+1)/2

El tiempo para el caso promedio es:
T(n) = P1((C1 + C2) + C3) + P2(2(C1 + C2) + C3) +...+ Pn(n(C1 + C2) + cC3)

Que se cumple cuando t es la parte entera de (n+1)/2

Aunque lo ideal sería calcular el tiempo de ejecución para el caso promedio, en la práctica se trabaja frecuentemente con el caso peor y con el mejor caso, debido a que el cálculo del caso promedio se hace difícil desde el punto de vista probabilístico, y en la inmensa mayoría de los casos es proporcional al tiempo del caso peor.

Notación asintótica: “O” grande, W Omega, q Theta

Llegamos a criterios objetivos sobre el comportamiento asintótico del tiempo de ejecución de un algoritmo analizando el comportamiento del mismo cuando el tamaño de la entrada crece y crece considerablemente

Definición 1:

T(n) es O(f(n)) si existen constantes positivas c y n0, tales que para los n >= n0 se cumple que T(n) <= cf(n)

f(n) es una cota superior para T(n)

Tomando el ejemplo del algoritmo BUSCAR anteriormente visto podemos ver que para el caso peor T(n) = O(n):
T(n) = (C1 + C2)n + C3 <= (C1 + C2 + 1)n = Cn para n >= [C3] = N0

Para el caso promedio T(n) es también O(n):

                (n + 1)        (C1 + C2)      (C1 + C2)          (C1 + C2)
T(n) = (C1+C2) --------- + C3 = --------- n + --------- + C3 <= (-------- + 1)n = Cn
                   2                2             2                2   

           (C1 + C2)   
para n >= (------- + C3) = N0
              2        

Definición 2:

T(n) es W(f(n)) si existen constantes positivas c y n0, tales que para los n >= n0 se cumple que T(n) >= cf(n)

f(n) es una cota inferior para T(n)

En el ejemplo de BUSCAR, el caso peor es W(n).

T(n) = (C1 + C2)n + C3 >= (C1 + C2)n = Cn n >= 1 = n0

Notas:
• Ver otra definición que propone el texto, donde solo exige que se cumpla la desigualdad para un número infinito de valores.
• W(f(n)) debe ser mencionada pero es mucho menos usada que la notación O.

Artículos relacionados:

Tiempo de ejecución (Parte 2)

Continuar leyendo

Acercamiento al uso de la informática educativa en Cuba

Luis Alberto [luisal@2fte.scu.rimed.cu]

Introducción.

La época actual, llamada Revolución Científico Técnica, necesita de hombres capaces de consultar un gran volumen de información en poco tiempo y utilizar ese caudal de conocimientos en la solución adecuada de los problemas que se plantean de forma creadora. El hombre contemporáneo está a prueba cada día cuando debe enfrentar disímiles problemas sociales, científico-técnicos, económicos, ideológicos, entre otros.

En el desarrollo de la Informática Educativa en Cuba, la utilización de la computación en la enseñanza de las investigaciones científicas, en la gestión docente ha constituido un objetivo priorizado de la Política Nacional Informática desde los primeros años de la Revolución, permitiendo la preparación del personal que pudiera asimilar las tecnologías que desde el propio año 1959 se empezó a introducir en el país. Educar es preparar al hombre para la vida social y esta ha de ser la contribución principal de la informática en la educación. Es observable que la preparación de los docentes que conducirán los menesteres de la tecnología educativa (TE) constituye uno de los retos principales que impone la aplicación y uso de la Tecnología de Información y la Comunicación (TIC) en el campo educativo, por lo que es prioritario la superación de los docentes, con el fin convertir la tecnología educativa en instrumento de formación cultural de todo el pueblo y a la vez que se traduzca en fuente de información, además para respaldar los métodos de enseñanza-aprendizaje y para la realización de actividades interdisciplinarias y colaborativas, posibilitando la alfabetización digital y una actualización didáctica que le ayude a conocer, dominar e integrar los instrumentos tecnológicos y los elementos culturales en general en su desempeño profesional. El término Informática Educativa que se asume como definición: “… es la parte de la ciencia de la informática encargada de dirigir, en el sentido amplio, todo el proceso de selección, elaboración, diseño y explotación de los recursos informáticos dirigidos a la gestión docente, entendiéndose por estas las enseñanzas asistidas por computadora y la administración docente”.

Desarrollo

La llegada de la computadora a las escuelas no constituye una suma de los momentos en que se emplea este equipo en la actividad escolar, sino un proceso donde cada uno de esos momentos está estrechamente relacionado entre sí, conformando un sistema. Para la introducción de la computadora, tanto en la gestión administrativa o escolar, en una asignatura, carrera, etc., es importante proyectar la estrategia a seguir, de forma tal que la inserción de la computadora en la escuela dé lugar a un cambio cualitativo en el desarrollo de la institución. El ordenador ha de ser considerado como una herramienta de uso general, útil para cualquier miembro de la comunidad educativa en función de sus necesidades. En este sentido, el objetivo fundamental debería ser enseñar y aprender con el ordenador, más que aprender de informática. Galvis, A. se refirió a las posibilidades que brinda la computadora y el uso de materiales de estudio computarizados en lo referente al nivel de interactividad, contribuyendo a una educación basada en el diálogo, debe quedar bien claro que no se trata de un material de estudio computarizado lo que con otros medios está probado con calidad” . Stephen, K. también comparte este criterio cuando señalaba: “no tiene sentido un programa de información limitado a pasar el texto por la pantalla, así no se logra sacar el mejor partido a las cualidades de las computadoras” . La integración con éxito de la computadora en el aula ha de partir de una adecuada formación del profesorado en las nuevas tecnologías. Esta capacitación informática debe orientarse hacia el objetivo de que cada maestro descubra, desde su propia realidad, intereses personales y expectativas profesionales, cómo el ordenador puede serle útil en su actividad docente. Para la divulgación del uso de la informática en el aula no basta con la disposición bienintencionada de los maestros más motivados o interesados en el tema. Es preciso, además, que el equipo directivo del centro, el claustro de docentes, las escuelas de padres, asuman como propios los proyectos relacionados con la informática educativa y respondan con esto a los requerimientos sociales que debe cumplir un maestro de estos tiempos. En el caso del aprendizaje con las TIC, Cervantes (2004) plantea que entre los retos de los maestros para el desarrollo de la Profesionalidad Pedagógica, está “la utilización adecuada de los medios y de los recursos tecnológicos necesarios de que se dispone en el país para la labor educativa” Lo referente a la superación de los docentes en la informática educativa, el programa de Informática Educativa enuncia dos objetivos fundamentales: 1. Actualizar a los profesores de Computación en ejercicio, diferenciando las particularidades de los docentes preparados en cursos emergentes y los egresados de la carrera Matemática- Computación. 2. Capacitar al resto del personal docente y cuadros de dirección en el uso de las nuevas tecnologías acorde con su perfil. Al valorar la informática como componente de las TIC y su integración curricular se evalúan experiencias alcanzadas con el uso del ordenador. En este sentido se exponen: La integración con éxito del ordenador en el aula ha de partir de una adecuada formación del profesorado en las nuevas tecnologías. Esta capacitación informática debe orientarse hacia el objetivo de que cada profesor descubra, desde su propia realidad, intereses personales y expectativas profesionales, cómo el ordenador puede serle útil en su actividad docente. Introducir el ordenador en el sistema educativo es algo más que un problema de dotación de recursos materiales. La utilidad de las herramientas informáticas es máxima cuando se ha conseguido integrar, de modo paulatino, esta tecnología con la cultura del centro educativo. Por otra parte la informática en su aplicación en los centros docentes se le definen tres esferas (Buratto, 2005): La informática como tema propio de enseñanza en todos los niveles del sistema educativo, debido a su importancia en la cultura actual; se la denomina también “Educación Informática”. La informática como herramienta para resolver problemas en la enseñanza práctica de muchas materias; es un nuevo medio para impartir enseñanza y opera como factor que modifica en mayor o menor grado el contenido de cualquier currículum educativo. Se le conoce como “Informática Educativa” La informática como medio de apoyo administrativo en el ámbito educativo, por lo que se le denomina “Informática de Gestión”. En la actualidad se considera la computadora como medio de enseñanza que no puede considerarse de forma aislada, el docente debe valorar su incorporación en el proceso de enseñanza – aprendizaje como elemento dentro del proceso didáctico de su asignatura” . Entre las principales características que se plantean sobre la computadora como medio de enseñanza, se enumeran las siguientes: 1. Permite la individualización de la enseñanza y, por tanto una atención diferenciada a los estudiantes. 2. Permiten la constante activación de los alumnos, por lo que aumenta su actividad cognitiva. 3. Permite la comprobación y/o corrección (retroalimentación) directa e inmediata de los resultados del aprendizaje. 4. Presentan amplias posibilidades de cálculo, velocidad de trabajo, versatilidad y flexibilidad, capacidad de almacenamiento de grandes masas de datos, efectos de animación, sonidos, uso de colores, así como capacidad de elección y decisión. 5. Fácil utilización del material de estudio, bajo distintas condiciones de trabajo, inclusos sin la presencia del profesor. 6. Capacidad de modificaciones y perfeccionamiento del material a bajo costo de materiales. 7. Facilitan el trabajo extradocente de forma controlada. 8. Permiten transmitir mayores volúmenes de informaciones, en menor tiempo y de forma controlada. 9. Permiten dirigir el proceso de refuerzo, autoaprendizaje y evaluación de los alumnos en forma individual.

Conclusiones

En el contexto de Cuba el uso de la informática educativa queda explicitado en el Programa de Informática Educativa elaborado por el Ministerio de Educación para el período 1996-2000 y que aun se mantiene vigente, en el se declara que uno de los sistemas en que se ejecuta la Informática Educativa en Cuba es a través del Sistema Nacional de Educación, donde se declaraban los siguientes objetivos iniciales, referidos a los escolares: 1. Se familiarizarán con las técnicas de computación para fomentar entre ellos el interés por su estudio. 2. Desarrollarán hábitos y habilidades para el trabajo interactivo con las computadoras y manipulación de los periféricos disponibles. 3. Asimilarán un conjunto de conceptos y procedimientos informáticos básicos que les permitirá resolver problemas sencillos, prioritariamente de otras asignaturas o de aplicación a áreas de su contexto.

Continuar leyendo

CLSID

Alien [blackhat4all@gmail.com]

Todos sabemos que desde que existe el Windows, existe el registro. Se conoce también por todos el vínculo tan estrecho que existe entre el registro y dicho sistema operativo. Este articulo no es para hablar sobre el registro, ni sobre Windows, este articulo esta escrito más bien para mostrarnos una forma de proteger información, sin necesidad de instalar programas extraños, o de dudosa procedencia, simplemente utilizando el registro, valla que es como si nos lo hubiesen puesto ahí.

Hace algún tiempo me estuve trabajando en una maquina donde no se podio tener ningún tipo de información personal, de hacerlo, era amonestado, y me vi en la imperiosa necesidad de buscar un método por el cual yo pudiera proteger de alguna forma la información que tenia. No podio instalar ningún programa, y las cosas como ocultar carpetas y luego mandar a no mostrar archivos o carpetas ocultas no me resolvían el problema.

Hable con varias personas para que me ayudaran a proteger la información no solo de los archivos, sino también de carpetas de gran tamaño en disco. Ninguna solución era de mi conveniencia, así que decidí recurrir al registro, quizás allí podría solucionar mi problema.

Hurgando en el regedit, me di cuenta que existía un sinnúmero de carpetas que decían CLSID, y dentro de ellas una cadena te texto parecida a: {9E56BE61-C50F-11CF-9A2C-00A0C90A90CE}.

Decidí por instinto copiar dicha cadena y ponerla dentro de un archivo de texto, sin ver resultado alguno, así, de esa forma hice varias pruebas, hasta que trate de ponerle esta cadena como extensión a un archivo. BINGO! El archivo cambio. Luego comprendí que las extensiones de Windows son solo ficticias, es decir, en verdad a Windows no le importa que el final de un archivo sea “.doc”, lo que realmente mira es la extensión que hay después, es decir una cadena de texto similar a la que vi en el registro, esa es la clave para informarle a Windows con que programa debe abrir cada archivo, por supuesto, al ponerle el CLSID a un archivo, automáticamente el archivo cambia de icono y la cadena de caracteres desaparece. Si esto se aplica a las carpetas funciona de la misma manera, es decir, al ponerle un CLSID adjunto a el nombre de la carpeta, esta toma el aspecto del icono que representa ese CLSID y la carpeta deja de abrirse con el explorer e intenta abrirse con el Word, por ejemplo, pero como la carpeta no es un documento dará un error. Algo así era lo que me hacia falta para proteger mis datos.

La cuestión era después como invertir el proceso.

La única solución para esto era a través del DOS, es decir, renombrar la carpeta por MS-DOS, y problema resuelto. Claro después de esto solo tenia que crear un programa que me automatizara el proceso, un simple .BAT.

Aquí les mando los códigos de algunos CLSID que encontré y su significado:

Base de datos.........{73A4C9C1-D68D-11D0-98BF-00A0C90DC8D9}
Escritorio ...........{9E56BE61-C50F-11CF-9A2C-00A0C90A90CE}
Correo electrónico....{9E56BE60-C50F-11CF-9A2C-00A0C90A90CE}
Adobe acrobat ........{B801CA65-A1FC-11D0-85AD-444553540000}
Archivo de sonido.....{00022601-0000-0000-C000-000000000046}
Archivo de video......{00022602-0000-0000-C000-000000000046}
Archivo de canal......{f39a0dc0-9cc8-11d0-a599-00c04fd64433}
Archivos exel.........{00020820-0000-0000-C000-000000000046}
Internet explorer.....{25336920-03F9-11cf-8FD0-00AA00686F13}
Sonido de midi........{00022603-0000-0000-C000-000000000046}
Power point...........{64818D10-4F9B-11CF-86EA-00AA00B929E8}
Para el Word..........{00020906-0000-0000-C000-000000000046}
Para los .cab.........{0CD7A5C0-9F37-11CE-AE65-08002B2E1262}
Para los txt..........{73FDDC80-AEA9-101A-98A7-00AA00374959}
Archivos xsl..........{48123bc4-99d9-11d1-a6b3-00c04fd91555}
Para mi PC............{20D04FE0-3AEA-1069-A2D8-08002B30309D}
Para carpetas web.....{BDEADF00-C265-11D0-BCED-00A0C90AB50F}
Panel de control......{21EC2020-3AEA-1069-A2DD-08002B30309D}
Impresora.............{2227A280-3AEA-1069-A2DE-08002B30309D}
Programador de tareas.{D6277990-4C6A-11CF-8D87-00AA0060F5BF}
Papelera de reciclaje.{645FF040-5081-101B-9F08-00AA002F954E}
Archivos no asociados.{00021401-0000-0000-c000-000000000046}

Pienso que es fácil de usar, y para más comodidad les mando un ejemplo del .BAT, claro que se puede agregar unas cuantas líneas, para mejorarlo, como por ejemplo que se cierre en cuanto se termine la operación, o que pida una clave para ejecutar el proceso:

Supongamos que tenemos una carpeta en el disco c:\ con nombre Max y estamos parados en el disco local c:\

Para aplicar el CLSID del Word y esconder la carpeta. Ren max max. {00020906-0000-0000-C000-000000000046}

Para volver a mostrar la carpeta Ren max. {00020906-0000-0000-C000-000000000046} max

Fácil verdad, quizás muchos no lo utilicen, pero en verdad a mi me resulto. Se pueden obtener muchos otros, solo depende de los programas que tengan instalados.

Continuar leyendo