Comandos TCP

327
Comandos TCP/IP para Windows Ping Tracert IpConfig NetStat Route Arp NbtStat Telnet Hostname Nslookup Netsh PathPing Ftp tftp Ping PING: Diagnostica la conexión entre la red y una dirección IP remota ping -t [IP o host] ping -l 1024 [IP o host] La opción -t permite hacer pings de manera continua, para detenerlo pulsar Ctrl-C. Este comando también es útil para generar una carga de red, especificando el tamaño del paquete con la opción -l y el tamaño del paquete en bytes. Tracert

Transcript of Comandos TCP

Comandos TCP/IP para Windows

Ping Tracert IpConfig NetStat Route Arp NbtStat Telnet Hostname Nslookup Netsh PathPing Ftp tftp

Ping

PING: Diagnostica la conexión entre la red y una dirección IP remota

ping -t [IP o host] ping -l 1024 [IP o host]

La opción -t permite hacer pings de manera continua, para detenerlo pulsar Ctrl-C.

Este comando también es útil para generar una carga de red, especificando el tamaño del paquete con la opción -l y el tamaño del paquete en bytes.

Tracert

TRACERT: Muestra todas las direcciones IP intermedias por las que pasa un paquete entre el equipo local y la dirección IP especificada.

tracert [@IP o nombre del host] tracert -d [@IP o nombre del host]

Este comando es útil si el comando ping no da respuesta, para establecer cual es el grado de debilidad de la conexión.

IpConfig

IPCONFIG: Muestra o actualiza la configuración de red TCP/IP

ipconfig /all [/release [tarjeta]] [/renew [tarjeta]] /flushdns /displaydns / registerdns [-a] [-a] [-a]

Este comando ejecutado sin ninguna opción, muestra la dirección IP activa, la máscara de red así como la puerta de enlace predeterminada al nivel de las interfaces de red conocidas en el equipo local.

/all: Muestra toda la configuración de la red, incluyendo los servidores DNS, WINS, bail DHCP, etc ...

/renew [tarjeta] : Renueva la configuración DHCP de todas las tarjetas (si ninguna tarjeta es especificada) o de una tarjeta específica si utiliza el parámetro tarjeta. El nombre de la tarjeta, es el que aparece con ipconfig sin parámetros.

/release [tarjeta]: Envía un mensaje DHCPRELEASE al servidor DHCP para liberar la configuración DHCP actual y anular la configuración IP de todas las tarjetas (si ninguna tarjeta es especificada), o de sólo una tarjeta específica si utiliza el parámetro tarjeta. Este parámetro desactiva el TCP/IP de las tarjetas configuradas a fin de obtener automáticamente una dirección IP.

/flushdns: Vacía y reinicializa el caché de resolución del cliente DNS. Esta opción es útil para excluir las entradas de caché negativas así como todas las otras entradas agregadas de manera dinámica.

/displaydns: Muestra el caché de resolución del cliente DNS, que incluye las entradas pre cargadas desde el archivo de host local así como todos los registros de recursos recientemente obtenidos por las peticiones de nombres resueltas por el ordenador. El servicio Cliente DNS utiliza esta información para resolver rápidamente los nombres frecuentemente solicitados, antes de interrogar a sus servidores DNS configurados.

/registerdns: Actualiza todas las concesiones DHCP y vuelve a registrar los nombres DNS.

NetStat

NETSTAT: Muestra el estado de la pila TCP/IP en el equipo local

NETSTAT [-a] [-e] [-n] [-s] [-p proto] [-r] [intervalo]

-a Muestra todas las conexiones y puertos de escucha. (Normalmente las conexiones del lado del servidor no se muestran).

-e Muestra estadísticas Ethernet. Se puede combinar con la opción -s. -n Muestra direcciones y números de puerto en formato numérico.

-p proto Muestra las conexiones del protocolo especificado por proto; proto puede ser tcp o udp. Utilizada con la opción -s para mostrar estadísticas por protocolo, proto puede ser tcp, udp, o ip.

-r Muestra el contenido de la tabla de rutas. -s Muestra estadísticas por protocolo. Por defecto, se muestran las estadísticas

para TCP, UDP e IP; la opción -p puede ser utilizada para especificar un sub conjunto de los valores por defecto.

intervalo Vuelve a mostrar las estadísticas seleccionadas, con una pausa de intervalosegundos entre cada muestra.

Presiona Ctrl+C para detener la presentación de las estadísticas.

Route

ROUTE: Muestra o modifica la tabla de enrutamiento

ROUTE [-f] [comando [destino] [MASK mascara de red] [puerto de enlace]

-f Borra de las tablas de enrutamiento todas las entradas de las puertas de enlace. Utilizada conjuntamente con otro comando, las tablas son borradas antes de la ejecución del comando.

-p Vuelve persistente la entrada en la tabla después de reiniciar el equipo. comando especifica uno de los cuatro comandos siguientes:

o DELETE: borra una ruta. o PRINT: Muestra una ruta. o ADD: Agrega una ruta. o CHANGE: Modifica una ruta existente.

destino: Especifica el host. MASK: Si la clave MASK está presente, el parámetro que sigue es interpretado

como el parámetro de la máscara de red. máscara de red: Si se proporciona, especifica el valor de máscara de subred

asociado con esta ruta. Si no es así, éste toma el valor por defecto de 255.255.255.255.

puerta de enlace: Especifica la puerta de enlace. METRIC: Especifica el coste métrico para el destino.

Por defecto, Windows XP no trae habilitado el “Ip Routing” que te permite reenviar paquetes entre dos redes, es decir, que tu PC haga de “router”.

ipconfig /all

Enrutamiento IP habilitado. . . . : No

Ejecutar el Editor de Registro (Regedit.exe). Encontrar el siguiente registro: HKEY_LOCAL_MACHINE\SYSTEM\

CurrentControlSet\Services\Tcpip\Parameters

Cambiar el valor (Value Data) de la entrada IPEnableRouter (del tipo REG_DWORD) por 1. El valor uno habilita en reenvío TCP/IP para todas las conexiones de red que tenga instalada la computadora.

Salir del Editor de Registro. Reiniciar el sistema.

Arp

ARP: Resolución de direcciones IP en direcciones MAC. Muestra y modifica las tablas de traducción de direcciones IP a direcciones Físicas utilizadas por el protocolo de resolución de dirección (ARP).

ARP -s adr_inet adr_eth [adr_if] ARP -d adr_inet [adr_if] ARP -a [adr_inet] [-N adr_if]

-a Muestra las entradas ARP activas interrogando al protocolo de datos activos. Si adr_inet es precisado, únicamente las direcciones IP y Físicas del ordenador especificado son mostrados. Si más de una interfaz de red utiliza ARP, las entradas de cada tabla ARP son mostradas.

-g Idéntico a -a. adr_inet Especifica una dirección Internet. -N adr_if Muestra las entradas ARP para la interfaz de red especificada por

adr_if. -d Borra al host especificado por adr_inet. -s Agrega al host y relaciona la dirección Internet adr_inet a la Física adr_eth. La

dirección Física está dada bajo la forma de 6 bytes en hexadecimal separados por guiones. La entrada es permanente.

adr_eth Especifica una dirección física. adr_if Precisado, especifica la dirección Internet de la interfaz cuya tabla de

traducción de direcciones debería ser modificada. No precisada, la primera interfaz aplicable será utilizada.

NbtStat

NBTSTAT : Actualización del caché del archivo Lmhosts. Muestra estadísticas del protocolo y las conexiones TCP/IP actuales utilizando NBT (NetBIOS en TCP/IP).

NBTSTAT [-a Nom Remoto] [-A dirección IP] [-c] [-n] [-r] [-R] [-s] [S] [intervalo]

-a (estado de la tarjeta) Lista la tabla de nombres del equipo remoto (nombre conocido).

-A (estado de la tarjeta) Lista la tabla de nombres del equipo remoto (dirección IP)

-c (caché) Lista el caché de nombres remotos incluyendo las direcciones IP.

-n (nombres) Lista los nombres NetBIOS locales. -r (resueltos) Lista de nombres resueltos por difusión y vía WINS. -R (recarga) Purga y recarga la tabla del caché de nombres remotos. -S (sesión) Lista la tabla de sesiones con las direcciones de destino IP. -s (sesión) Lista la tabla de sesiones establecidas convirtiendo las direcciones de

destino IP en nombres de host a través del archivo host.

Un ejemplo:

nbtstat -A @IP

Este comando devuelve el nombre NetBIOS, nombre del sistema, los usuarios conectados&del equipo remoto.

Telnet

TELNET

telnet <IP o host> telnet <IP o host> <port TCP>

El comando telnet permite acceder en modo Terminal (Pantalla pasiva) a un host remoto. Este también permite ver si un cualquier servicio TCP funciona en un servidor remoto especificando después de la dirección IP el número de puerto TCP. De este modo podemos verificar si el servicio SMTP, por ejemplo, funciona en un servidor Microsoft Exchange, utilizando la dirección IP del conector SMTP y luego 25 como número de puerto. Los puertos más comunes son:

ftp (21), telnet (23), smtp (25), www (80), kerberos (88), pop3 (110), nntp (119) et nbt (137-139).

Hostname

HOSTNAME: Muestra el nombre del equipo

nslookup

(Name System Lookup) Resuelve consultas DNS

nslookup [-option] [hostname] [server] nslookup ip nslookup elhacker.net Es posible modificar el modo de consulta del comandonslookup usando el argumento set:

set type=all: Muestra todo los registros dns de un dominio. set type=mx: Permite obtener información relacionada con el(los) servidor(es)

de correo de un dominio. set type=ns: Permite obtener información del servidor de nombres relacionado

al dominio. set type=a: Permite obtener información de un host de la red. Se trata de un

modo de consulta predeterminado. set type=soa: Permite mostrar la información del campo SOA (inicio de

autoridad). set type=cname : Permite mostrar información relacionada con los alias. set type=hinfo: Permite mostrar, siempre y cuando los datos estén disponibles,

la información relacionada con el material y el sistema operativo del host.

Para salir del comando nslookup, basta con introducir la palabra exit.

netsh

El comando netsh es útil para guardar dtas configuraciones de red y cambiarlas mediante un bat. Netsh, también llamado NetShell o Network Shell, es una herramienta basada en línea de comandos. Entre las opciones de la línea de comandos de Netsh se incluyen:

-a archivoAliasEspecifica que se utiliza un archivo de alias. Un archivo de alias contiene una lista de comandos netsh y una versión con alias, de manera que puede utilizar la línea de comandos con alias en lugar del comando netsh. Puede usar archivos de alias para asignar comandos que pueden resultar más familiares en otras plataformas para el comando netsh correspondiente.-c contextoEspecifica el contexto del comando que corresponde a un archivo DLL auxiliar instalado.comandoEspecifica el comando netsh que se va a ejecutar.-f archivoDeComandosEspecifica que se ejecutarán todos los comandos netsh del archivo archivoDeComandos.-r equipoRemotoIndica que los comandos netsh se ejecutan en un equipo remoto especificado mediante su nombre o dirección IP.

En Windows 2000/XP y superiores es posible modificar los parámetros TCP/IP desde la línea de comandos, por ejemplo para automatizar esta tarea utilizando un script .

Esto es posible gracias a la herramienta netsh.exe (NetShell), cuyos parámetros precisaremos a continuación:

Configuración de la dirección IP Para la configuración de una dirección IP estática netsh interface ip set address "Description" static %adresse% %netmask% %gateway% %metric%

Description: designa un texto describiendo el nombre de la conexión %adresse%: designa la dirección IP %netmask%: representa la mascara de la sub red %gateway%: representa la dirección IP de la puerta de enlace %metric%: representa el metric de la tarjeta de red (por lo general=1)

Por ejemplo: netsh interface ip set address "Red local" static 192.168.0.3 255.255.255.0 192.168.0.1 1 Para la configuración de una dirección IP dinámica (DHCP) netsh interface ip set address "Description" dhcp

Configuración de los servidores de nombres (DNS) netsh interface ip set dns "Description" static %DNS%

%DNS%: designa la dirección IP del servidor DNS

Guardar una configuracion:--------------------------netsh dump > fichero.dmp

Cargar una configuracion guardada:----------------------------------netsh exec fichero.dmp

abort - Descarta los cambios realizados estando en modo Sin conexión.add - Agrega una entrada de configuración a una lista de entradas.advfirewall - Cambia al contexto `netsh advfirewall'.alias - Agrega un alias.bridge - Cambia al contexto `netsh bridge'.bye - Sale del programa.commit - Confirma los cambios realizados en el modo Sin conexión.delete - Elimina una entrada de configuración de una lista de entradas.dhcpclient - Cambia al contexto `netsh dhcpclient'.

exit - Sale del programa.firewall - Cambia al contexto `netsh firewall'.http - Cambia al contexto `netsh http'.interface - Cambia al contexto `netsh interface'.ipsec - Cambia al contexto `netsh ipsec'.lan - Cambia al contexto `netsh lan'.nap - Cambia al contexto `netsh nap'.netio - Cambia al contexto `netsh netio'.offline - Establece el modo actual a Sin conexión.online - Establece el modo actual a En línea.p2p - Cambia al contexto `netsh p2p'.popd - Extrae un contexto de la pila.pushd - Inserta el contexto actual en la pila.quit - Sale del programa.ras - Cambia al contexto `netsh ras'.rpc - Cambia al contexto `netsh rpc'.set - Actualiza la configuración de la información.show - Muestra información.unalias - Elimina un alias.winhttp - Cambia al contexto `netsh winhttp'.winsock - Cambia al contexto `netsh winsock'.wlan - Cambia al contexto `netsh wlan'.

Comandos heredados desde el contexto netsh interface:6to4 - Cambia al contexto `netsh interface 6to4'.add - Agrega una entrada de configuración a una tabla.delete - Elimina una entrada de configuración de una tabla.ipv4 - Cambia al contexto `netsh interface ipv4'.ipv6 - Cambia al contexto `netsh interface ipv6'.isatap - Cambia al contexto `netsh interface isatap'.portproxy - Cambia al contexto `netsh interface portproxy'.reset - Restablece la información.set - Establece la configuración de la información.show - Muestra información.tcp - Cambia al contexto `netsh interface tcp'.teredo - Cambia al contexto `netsh interface teredo'.

Comandos en este contexto:? - Muestra una lista de comandos.add - Agrega una entrada de configuración a una tabla.delete - Elimina una entrada de configuración de una tabla.dump - Muestra un script de configuración.help - Muestra una lista de comandos.install - Instala el protocolo IP.reset - Restablece las configuraciones de IP.set - Establece la configuración de la información.show - Muestra información.uninstall - Desinstala el protocolo IP.

Para Windows 7 Firewall: Para ver un resumen: netsh advfirewall show currentprofilePara obtener las reglas del firewall: netsh advfirewall firewall rule name=allPara deshabilitarlo: netsh firewall set opmode disableReestablecer TCP/IP: netsh int ip reset c:\tmp\resetlog.txtReestablecer Winsock2: netsh winsock resetVer contraseña de una conexión Wireless en texto claro (hexadecimal): netsh wlan export profile folder=. key=clear

PathPing

Muestra la ruta a un host TCP/IP y las pérdidas de paquetes en cada enrutador del camino.

Ftp

FTP: Cliente de descarga de archivos

ftp -s:<file>

-s : esta opción permite ejecutar un FTP en modo batch: especifica un archivo textual conteniendo los comandos FTP.

tftp

Trivial File Transfer Protocol (TFTP)

tftp [-i] [Host] [{get | put}] [Source] [Destination]

 

Windows admite el protocolo de transferencia de archivos (FTP) y protocolo de transferencia de archivos trivial (TFTP) en su implementación de TCP/IP. Ambos de estos protocolos se pueden utilizar para transferir archivos a través de Internet. A continuación se explican las diferencias entre los dos protocolos:

Diferencias entre el FTP y TFTP

FTP es un protocolo de transferencia de archivo completo orientado a la sesión, general propósito. TFTP se utiliza como un protocolo de transferencia de archivos de propósito especial básica.

FTP puede utilizarse de forma interactiva. TFTP permite a sólo unidireccional transferencia de archivos.

FTP depende de TCP, conexión orientada y proporciona control confiable. TFTP depende de UDP, requiere menos sobrecarga y no proporciona prácticamente ningún control.

FTP proporciona autenticación de usuario. TFTP no. FTP utiliza números de puerto TCP conocidos: 20 para datos y 21 para el cuadro

de diálogo de conexión. TFTP utiliza número de puerto UDP 69 para su actividad de transferencia de archivos.

El servicio de servidor FTP de Windows NT no admite TFTP porque TFTP no admite la autenticación.

Windows 95 y TCP/IP-32 para Windows para trabajo en grupo no incluyen un programa de cliente TFTP.

Como reparar "Restaurar Sistema", en Windows XP

Como reparar "Restaurar Sistema", en Windows XP

Este artículo recoge los problemas más comunes con la herramienta Restaurar sistema de Windows XP así como algunas sugerencias para intentar solucionarlos.

SÍNTOMAS

1º Puede experimentar en su sistema lo siguiente:

2º Ha perdido varios o todos los puntos de restauración que había creado con anterioridad.Al tratar de ejecutar la citada aplicación aparece el mensaje:

Restaurar sistema no puede proteger su equipo. Reinicie el equipo y vuelva a ejecutar Restaurar sistema.

Al reiniciar el equipo e intentarlo de nuevo, el error persiste.

3º No puede restaurar el sistema a ningún punto. El proceso falla se elija el punto que se elija.

4º El calendario de Restaurar sistema está en blanco.

5º No aparece la pestaña Restaurar sistema en Propiedades del sistema o la casilla Desactivar Restaurar sistema está desactivada (en gris). Por tanto, no puede configurar correctamente la herramienta.

6º El asistente de restauración se bloquea cuando el usuario trata de crear un punto o de restaurar el sistema a un estado anterior.

7º Cuando trata de abrir Restaurar sistema, no aparece nada en pantalla o aparece una ventana en blanco.

SOLUCIONES

Síntoma 1

Si ha perdido varios puntos de restauración, verifique que el espacio asignado a Restaurar sistema sea el suficiente para albergar la cantidad de puntos de restauración que necesite. Cuando se alcanza el tamaño máximo, algunos puntos de restauración son eliminados, al igual que se eliminan los puntos que llevan 90 días en el sistema. Otra causa de pérdida de puntos de restauración viene derivada de la detención y posterior inicio del servicio de restauración. AbraInicio, Ejecutar, escriba eventvwr.msc, pulse Aceptar y revise los sucesos con origen Sr o Srservice. Los dos causantes mayoritarios de estos problemas son la aplicación Real Player y los antivirus mal diseñados. Consulte en la web del fabricante de estas aplicaciones para ver si hay alguna actualización disponible o prescinda momentáneamente de las mismas y compruebe si funciona correctamente Restaurar sistema.

Adicionalmente eche un vistazo a este documento de Microsoft: La utilidad Restaurar sistema puede quedar suspendida en una unidad del sistema aunque haya suficiente espacio de disco.

Síntoma 2

Este error suele aparecer cuando hay una corrupción en cierta clave del Registro. Cualquiera de los siguientes dos métodos debería solucionar su problema, emplee el que le resulte más cómodo:

Método 1

Dispone de un REG como soporte en nuestro repositorio. Para aplicarlo, haga doble clic sobre el mismo, pulse Sí y haga clic finalmente sobre Aceptar.

Nota: El REG presupone que su instalación de Windows está en el disco C. Si no fuera así, una vez aplicado el REG, abra Inicio, Ejecutar, escriba regedit, pulse Aceptar y acceda a la clave HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\srservice\Parameters. Cambie el contenido del valor ServiceDll que aparecerá en la parte derecha para que contenga la letra de la unidad donde tiene instalado XP.

Método 2

Nota: Este método requiere que tenga a mano su CD de Windows XP. Perderá todos los

puntos de restauración creados hasta el momento.

1º Abra Inicio, Ejecutar, escriba inf y pulse Aceptar.2º Haga clic con el botón derecho del ratón sobre el archivo Sr.inf.3º Pulse Instalar.4º Cuando finalice la instalación y se le pida reiniciar el sistema, haga clic sobre Sí.

Síntoma 3

En primer lugar, desactive y active de nuevo la utilidad Restaurar sistema siguiendo estos pasos (perderá irremediablemente todos los puntos de restauración creados):

1º Abra Inicio, Ejecutar, escriba sysdm.cpl y pulseAceptar.2º Marque la pestaña Restaurar sistema.3º Pulse sobre la casilla Desactivar Restaurar sistema (o Desactivar Restaurar sistema en todas las unidades).4º Pulse Aceptar y haga clic en Sí.5º Repita los pasos anteriores pero esta vez desmarque la casilla citada en el punto 3.

Hecho esto, intente crear un nuevo punto de restauración y restaure el sistema empleando dicho punto. Si siguiese el problema, tenga en cuenta las siguientes sugerencias:

Desactive todo tipo de residentes que tenga activos en Windows y proceda con la creación de los puntos de restauración. Suele ser buena idea utilizar la herramienta en Modo seguro y verificar si todo funciona correctamente en dicho modo. Para iniciar el PC en Modo seguro, pulse F8 antes de que aparezca la pantalla de carga de XP y seleccione dicha opción en el menú de arranque que aparecerá en pantalla.

Revise el procedimiento descrito en la sección Síntoma 5.

Síntoma 4

Se trata de un problema documentado en las páginas de soporte de Microsoft. Pinche aquí para obtener más información: System Restore Tool Displays a Blank Calendar in Windows XP –En inglés -Traducción automática al español

El problema se corrigió con el Service Pack 1 para Windows XP. Siempre es aconsejable utilizar el último Service Pack que esté disponible. Descargue y aplique SP2 desde Microsoft Update o desde este enlace

Adicionalmente, si nada de lo anterior solucionara el problema, realice estos pasos:

1º Abra Inicio, Ejecutar.

2º Escriba regsvr32 mshtmled.dll y pulse Aceptar.3º Haga clic sobre Aceptar cuando aparezca el cuadro de diálogo de título RegSvr32.4º Abra Inicio, Ejecutar.5º Escriba regsvr32 /i mshtml.dll y pulse Aceptar.6º Haga clic sobre Aceptar cuando aparezca el cuadro de diálogo de título RegSvr32.7º Intente abrir Restaurar sistema de nuevo.

Síntoma 5

Es posible que haya quedado aplicada una directiva local:

- Para XP Home Edition:

1º Abra Inicio, Ejecutar, escriba regedit y pulse Aceptar.2º Busque la clave HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows NT\SystemRestore.3º Con dicha clave seleccionada haga clic sobre Edición, Eliminar.4º Pulse Sí.5º Haga clic sobre Archivo, Salir y reinicie el sistema.

- Para XP Professional:

1º Abra Inicio, Ejecutar, escriba gpedit.msc y pulseAceptar.2º Acceda a Configuración del equipo\Plantillas administrativas\Sistema\Restaurar sistema.3º Busque en el panel de la derecha la directiva Desactivar Restaurar sistema.4º Haga doble clic sobre la misma, seleccione No configurada y pulse Aceptar.5º Cierre Directiva de grupo y reinicie el sistema.

Si lo anterior no le dio resultado, verifique si el servicio "Servicio de restauración del sistema" está iniciado:

1º Abra Inicio, Ejecutar, escriba services.msc y pulse Aceptar.2º Busque el servicio "Servicio de restauración de sistema" y haga doble clic sobre el mismo.3º Verifique que el tipo de inicio esté establecido en Automático y que el estado del servicio sea Iniciado.

Si no estuviera iniciado el servicio, pulse el botón Iniciar. Es posible que tras pulsar dicho botón obtenga un mensaje como este (aunque no sea literalmente el mismo mensaje de error, la solución que se describirá a continuación podría ser igualmente válida)

Error 5: Acceso denegado

En este caso le pueden ser de utilidad los siguientes pasos:

Aviso: El siguiente procedimiento implica manipular una carpeta del sistema operativo Windows. Tome las debidas precauciones y siga al pie de la letra las instrucciones aquí descritas.

1º Abra Mi PC, Herramientas, Opciones de carpeta, pestaña Ver, marque la opción Todos los archivos y carpetas ocultos y desmarque Ocultar archivos protegidos del sistema operativo (recomendado). Pulse Aceptar.2º Abra el disco C y renombre la carpeta System Volume Information a Sysvol o cualquier cosa que se le ocurra.

Nota: Para hacer esto debe asignar ciertos privilegios desde una cuenta administrativa hacia dicha carpeta. Revise este artículo:

Obtener acceso a la carpeta Información del volumen del sistema3º Reinicie el sistema y compruebe si Restaurar sistema funciona correctamente (si no funcionase, repase si el servicio está iniciado e inícielo manualmente como se ha descrito anteriormente). Si todo funcionase, puede eliminar la carpeta Sysvol que tendrá en C.

Nota: Al realizar este procedimiento se perderán todos los puntos de restauración que tenga creados hasta la fecha.

Síntoma 6

Este problema suele aparecer cuando el servicio "Registro de sucesos" está deshabilitado o detenido:

1ºAbra Inicio, Ejecutar, escriba services.msc y pulse Intro.2º Busque el servicio Registro de sucesos y haga doble clic sobre el mismo.3º Compruebe que el estado del servicio sea Iniciado y que el tipo de inicio sea Automático; si no fuese así, modifique estos valores.4º Haga clic en Aceptar y cierre el panel Servicios.

Síntoma 7

Realice el siguiente procedimiento:

1º Abra Inicio, Ejecutar, escriba regsvr32 vbscript.dll y pulse Aceptar.2º Haga clic sobre Aceptar cuando aparezca el mensaje con títuloRegsvr32.3º Abra Inicio, Ejecutar, escriba regsvr32 jscript.dll y pulse Aceptar.4º Haga clic sobre Aceptar cuando aparezca el mensaje con título Regsvr32.

MÁS INFORMACIÓN

Dispone de más información sobre problemas con Restaurar sistema en los siguientes enlaces:

Desactivar "Restaurar Sistema" en Windows XP

Como recuperar el sistema con Windows XP

¿ Qué es el archivo Pagefile.sys ?

Qué es y para que sirve el archivo Pagefile.sys

Este archivo es muy especial y lo usa Windows para almacenar temporalmente datos los cuales son intercambiados entre la memoria RAM y éste, con el fin de disponer de un bloque mas grande de memoria, a ésta se le conoce como MEMORIA VIRTUAL

El nombre del archivo es pagefile.sys y se crea en el momento de la instalación de Windows en la unidad raiz (normalmente C:\) donde se encuentra el boot del sistema y sus atributos son de oculto.

El archivo pagefile.sys normalmente no se deberia poder ver en el explorador de Windows, a menos que hayas desactivado la opcion "Ocultar archivos protegidos del sistema".

El tamaño de archivo pagefile.sys normalmente es 1.5 veces mas grande que la memoria RAM del sistema. (Por ejemplo, si tienes 1GB de RAM, el archivo deberia pesar algo como 1.5GB, si tienes 256MB, el archivo deberia pesar algo como 384B, y así, etc.)

Como optimizar y cual es la mejor ubicacion del archivo Pagefile.sys

Algunos tips que deberias tener en cuenta para manejar mucho mejor ese archivo:

1. Evite crear o tener un archivo pagefile.sys en el mismo disco duro donde se encuentran los archivos del sistema operativo. Esto se logra teniendo dos discos duros, si tienes Windows en C:\, puedes configurar un solo archivo pagefile.sys ubicado en la primera particion del segundo disco duro, por ej: D:\

2. No crees archivos pagefile.sys en varias particiones en el mismo disco duro, solo necesitas crear una rchivo pagefile.sys en una sola particion.

3. No crees archivos pagefile.sys en discos duros espejo (backup) ó en particiones RAID-5

Así pues bastará con crear únicamente un archivo pagefile.sys en el sistema.

Como crear ó establecer un archivo pagefile.sys?

Se puede configurar individualmente un archivo pagefile.sys en cada unidad que deseemos como se indica a continuación:

1. Click derecho sobre "Mi PC" y Click en "Propiedades"

ó Click en el boton "Inicio" > Click en "Panel de Control" > Doble Click en el icono "Sistema"

2. Ahora click en la pestaña "Opciones avanzadas" (Windows XP) | ó "Avanzado" (Windows 2000)

3. Debajo de la seccion "Rendimiento" click en el boton "Configuracion" (Windows XP) | ó click en "Opciones de rendimiento" (Windows 2000)

4. Ahora click en la pestaña "Opciones avanzadas" (Sólo Windows XP) 5. En la seccion "Memoria virtual" click en el boton "Cambiar" 6. Como deciamos anteriormente, recomendamos un solo archivo pagefile.sys.

Asegúrate de que solo se haya configurado un archivo pagefile.sys:

En la parte de arriba aparecen listadas las unidades de disco disponibles, para ver si tienen un archivo pagefile.sys configurado, bastara con seleccionar una unidad, y ver si algunas de las siguientes opciones estan marcadas (Windows XP):

[] Tamaño personalizado (Manualmente puedes configurar el tamaño del archivo pagefile.sys en la unidad seleccionada)[] Tamaño administrado por el sistema (Se configura automaticamente) Recomendado![] Sin archivo de paginación (La unidad de disco seleccionada no tiene el archivo pagefile.sys)

En Windows 2000, solo está disponible la opcion de establecer manualmente el mínimo y el máximo.

Removiendo / Eliminando un archivo Pagefile.sys

En WindowsXP, si quieres modificar esto, por ejemplo, remover ó borrar el archivo pagefile.sys de C:, marca la unidad C:, a continuacion selecciona la opcion [] Sin archivo de paginación y finalmente click en el boton "Establecer"

Windows quitará el archivo "pagefile.sys" de la unidad seleccionada en el siguiente reinicio.

En Windows 2000, para remover ó borrar el archivo pagefile.sys de C:, marca la unidad C:, a continuacion entra los valores "0" a cada una de las casillas, de Tamaño inicial y tamaño Máximo y finalmente click en el boton "Establecer"

Windows quitará el archivo "pagefile.sys" de la unidad seleccionada en el siguiente reinicio.

Nota: En windows 2000, si NO existe archivo de paginación, te saldrá una ventana de aviso avisándote esto en cada reinicio.

Estableciendo un archivo Pagefile.sys

Para crear un archivo "pagefile.sys", por ejemplo, en D:, marca la unidad D:, a continuacion selecciona la opcion [] Tamaño administrado por el sistema y

finalmente click en el boton "Establecer"

Windows creará el archivo "pagefile.sys" en la unidad seleccionada en el siguiente reinicio.

Nota: No se recomienda establecer un tamaño personalizado manualmente, a menos que sepa lo que hace.

P A R A T E N E R E N C U E N T A

Por lo general, Windows solo configura un archivo de paginación pagefile.sys por cada unidad de disco duro. Así que si nuestra unidad de disco tiene dos o mas particiones, Windows sólo crea un archivo pagefile.sys normalmente en la primera particion, ej: C:\

Si tienes dos discos duros, Windows creará otro archivo pagefile.sys en la primer particion del segundo disco duro, y así sucesivamente.

Mi sistema puede funcionar sin un archivo pagefile.sys?

Respuesta sencilla

Hmmm, la respuesta es SI. SI, si tu sistema posee la suficiente memoria RAM como para no preocuparte cuando estes ejecutando el máximo de aplicaciones y realizando la mayor cantidad de tareas en un dia de maximo trabajo. Si posees por ejemplo 2GB o mas, puedes probar haber como trabaja tu sistema.

Ahora, como recomendacion profesional, NO, NO recomiendo que dejes el sistema sin ningún archivo pagefile.sys, tu sistema puede llegar a necesitar algo de memoria extra en algun momento, y al no poder usar la memoria VIRTUAL quizás pueda provocar algún tipo de crash (congelamiento) del sistema, así que estas advertid@. Muchas cosas dejaran de funcionar si lo eliminas y muchos fabricantes crean software basándose en que dicho archivo existe en el disco duro, y además Windows XP no utiliza el archivo hasta que lo necesita con lo que no obtendrás ningún beneficio eliminándolo.

Nota: En windows 2000, si NO existe archivo de paginación, te saldrá una ventana de aviso avisandote esto en cada reinicio.

Respuesta técnica

Debido a que la Memoria Virtual siempre está en operación, no puede apagarse. Lo cual traduciria en "decirle al sistema que NO use espacio de archivo de paginación en ningun momento"

Esto podría provocar un consumo excesivo de memoria RAM. La razon es que cuando los programas piden por un espacio en la memoria virtual, estos normalmente solicitan más espacio del que normalmente usan - el total podría llegar a algunos cientos de megabytes. Esas direcciones de espacio tienen que asignarse en algun lugar por el sistema. Si existe un archivo de paginación disponible, el sistema entonces asignará espacio en él a estas solicitudes - pero si no lo hay, entonces asignará espacio en direcciones de la memoria física RAM, bloqueando el acceso a estas direcciones RAM

por parte del sistema (si algun programa necesita RAM, y esta está toda ocupada, pues no se podrá ejecutar el programa)

Así pues, por mas que tengas memoria RAM, es mejor tener disponible memoria virtual.

Puedo ver el tamaño que está usando actualmente el archivo pagefile.sys?

Asegúrate de tener activadas las opciones:

Ver los archivos ocultos del sistema y las extensiones de archivos en Windows 2000/XP

1. Abra una ventana del Explorador de Windows 2. Click en el menú Herramientas > Opciones de carpeta 3. Click en la pestaña Ver 4. Ahora busque y marque la opcion "Mostrar todos los archivos y carpetas

ocultos" 5. Ahora más abajo busque la opcion "Ocultar las extensiones para tipos

conocidos de archivo" y desmárquela 6. Tambien desmarque la opcion "Ocultar archivos protegidos del sistema

operativo" 7. Click en Aceptar

Ahora ya podrás ver el archivo "pagefile.sys" y el tamaño que tiene. Navega por las distintas unidades y verifica su existencia.

En que sistemas Windows debería aparecer el archivo pagefile.sys?

En Windows 2000, Windows XP y Windows 2003

Como borrar el archivo Pagefile.sys ?

El archivo pagefile.sys es necesario en el sistema y no deberias intentar borrarlo. Mientras Windows se esté ejecutando el archivo pagefile.sys está protegido por lo que te será imposible borrarlo.

Problemas conocidos de Pagefile.sys ?

Síntoma:Al iniciar el antivirus (nod32) sale el error: "C:\pagefile.sys - Error abriendo archivo (El archivo esta bloqueado)(4)"

Solución:El NOD32 debido a la heurística que posee encuentra el archivo pagefile.sys y lo intenta escanear, pero al ser un  archivo del sistema, está protegido (y en uso por supuesto) por lo que le es imposible escanearlo, así que es normal y no hay de

preocuparse.

Síntoma:El archivo pagefile.sys se ha dañado, posiblemente por un apagado anormal.

Solución:Vaya a la configuracion de la Memoria virtual, y fije como "0" o como "Sin archivo de paginación" en la unidad donde se encuentra el pagefile.sys, entonces acepta y sal de ahí, apaga el computador y reinicia. Ve a donde se encuentra físicamente el archivo "pagefile.sys" y bórralo (si existe)(en cada unidad, si existen otras ademas de C:), ahora vuelve a configurar la memoria virtual (esto creara otro nuevo y correcto pagefile.sys) en las unidades que elijas.

Windows 98 y ME tienen archivo Pagefile.sys ?

NO. En Windows 98 y ME, el archivo de intercambio se llama WIN386.SWP y está localizado en c:\windows\win386.swp

Sus funciones son las mismas que el pagefile.sys en Windows 2000 y XP.

Recursos:

http://aumha.org/win5/a/xpvm.php

http://aumha.org/win4/a/memmgmt.html

Trucos Google, Trucos de búsqueda y Curiosidades sobre el buscador

- Buscar frase exacta - Encontrar páginas por palabras

- Encontrar páginas palabra u otra

- Forzar palabras para su búsqueda

- Uso de comodines - Mayúsculas y minúsculas

- Uso del comando Link: - Uso del comando Allinurl: - Uso del comando Allintitle:

- Uso del comando Allintext: - Uso del comando Allinanchor:

- Uso del comando Site:

- Uso del comando Info: - Uso del comando Inurl: - Uso del comando Intitle:

- Uso del comando Cache: - Uso del comando Related: - Uso del comando Stocks:

- Uso del comando Filetype: - Uso del comando Define: - Operadores en google

- Utilidades en Google - Búsquedas en Google a través del e-mail

- Las 100 webs más citadas de la red

- Una calculadora de PageRank

- Una aplicación para vigilar a googlebot

- Posicionamiento web en Google

- Historia del buscador Google - Preguntas directas que tienen respuesta

- Servicio de comparación

- Google Bombing - Curiosidades - Las palabras más buscadas

- Buscadores Específicos - ¿Como evito que busque en mi sitio?

- Huevos de Pascua en Google

- Respuestas directas en Google    

 

 

Buscar frase exacta

- Si quieres buscar una frase exacta, introdúcela entre comillas (""). Por ejemplo:"diarios deportivos"

Encontrar páginas que incluyan determinadas palabras

- Para encontrar páginas que incluyan determinadas palabras, pero no otras, deberemos incluir el signo '-' delante de las que no queremos buscar. Por ejemplo, para descubrir webs que incluyan la palabra 'tienda', pero no la palabra 'online':tienda -online

Encontrar páginas que incluyan una determinada palabra u otra

- Si pretendemos encontrar una determinada palabra u otra, usaremos 'OR' (o bien el símbolo '|' (AltGr+1). Por ejemplo, para buscar webs de en los que aparazca 'tienda' y 'zapatos', o bien 'tienda' y 'pantalones':tienda (zapatos OR pantalones)tienda (zapatos | pantalones)

Forzar palabras para su búsqueda

- Hay numerosas palabras (en español: 'a', 'de', 'el', ...; en inglés: 'to', 'of', 'the',...) que Google no tiene en cuenta en sus búsquedas, a no ser que lo indiquemos. Para ello, escribiremos el signo '+' delante de estas palabras. Por ejemplo, estas dos búsquedas no generan los mismos resultados:el mundo+el mundo

Uso de comodines

- Se puede hacer uso de comodines. Esto es, el símbolo '*' puede ser usado para sustituir a una palabra, y facilitar algunas búsquedas. Por ejemplo:"los * años""los * * años"

Mayúsculas y minúsculas

- No es necesario distinguir las mayúsculas de las minúsculas. Estas dos búsquedas generan los mismos resultados:NoTiCiAsnoticias

Uso del comando Link:

Lista todos los enlaces, que teniendo page rank 4 o más, apuntan a nuestra página. Su uso es sencillo: link:www.direccion.com

Uso del comando Allinurl:

Muestra todas las páginas indexadas de un dominio indicado, o bien, las páginas que tienen todas las palabras especificadas en su url. Su sintaxis es: allinurl:www.dominio.com

Uso del comando Allintitle:

Muestra las páginas que tienen todas las palabras especificadas en su título. allintitle: palabra1 palabra2 Devuelve las páginas que tienen palabra1 y palabra2 en su título.

Uso del comando Allintext:

Páginas que tengan todas las claves especificadas dentro de su body.

Uso del comando Allinanchor:

Páginas que tengan en el texto que las apuntan las palabras especificadas.

Uso del comando Site:

Indica un determinado dominio que le indiquemos para realizar la búsqueda. Un ejemplo de su uso sería: site:www.dominio.com palabra Esto busca todas las páginas con alguna ocurrencia 'palabra' dentro del dominio especificado. También lo podemos usar para saber cuántas urls tiene indexadas google de un dominio:

Ejemplo: site:elhacker.net

Buscar Buscar en elhacker.net

Uso del comando Info:

Nos muestra información sobre la página principal de un dominio especificado. info:www.dominio.com

Uso del comando Inurl:

Busca la palabra que le especifiquemos en la url, pero no pide que todas estén en la url como allinurl.

Uso del comando Intitle:

Busca la palabra que le especifiquemos en el título, pero no es necesario que todas estén en el título. Por ejemplo intile:clave1 clave2 Busca clave1 en la url.

Uso del comando Cache:

Nos lleva directamente a la versión que tiene google de una determinada página. cache:www.elhacker.net Y directamente a la caché que tiene almacenada google de www.elhacker.net

Uso del comando Related:

Según google nos muestra sitios relacionados con la dirección que le especifiquemos, a saber que criterio sigue, porque los resultados más que malos, son nulos. No merece la pena usarlo.

Uso del comando Stocks:

Nos lleva a Yahoo Finance y nos muestra información de tipo financiero relacionada con la marca que le indiquemos.

Uso del comando Filetype:

Busca un tipo de documento especificado, por ejemplo: filetype:doc clave Busca ficheros '.doc' relacionados con 'clave'. ¿Útil, no?.

Uso del comando Define:

Para buscar la definición de una palabra debemos utilizar la palabra "define:" seguido de dos puntos, luego de los dos puntos debemosindicar la palabra a buscar.

"hacker""define:hacker"

Operadores en google

1. " " : Las comillas son un tipo de operador especial que usaremos para buscar cadenas exactas. "Clave1 y Clave2", busca páginas con esa ocurrencia exacta, clave1 seguido de y, a su vez seguido de clave2.2. '+' : Es el operador AND, busca esto, y esto otro.3. '-' : Especifica que no se busque lo que sigue al '-'. Ejemplo: clave1 -clave2, busca páginas relacionadas con 'clave1' pero en las que no aparezca 'clave2'.4. OR : El operador OR, siempre va en mayúsculas. Busca bien esta cosa, esta otra, o las dos. clave1 OR clave2, busca páginas relacionados con algunas de las dos claves o con las dos.5. 1850..1900: Búsquedas por rango de números.

Utilidades en google

1. www.dominio1.com OR www.dominio2.com : Gracias a esto podemos comparar dos páginas de temáticas completamente diferentes y ver cual de las dos está mejor valorada por google, sin centrarnos en términos particulares.2. inurl:addurl o inurl:addurl clave.: Y tendremos unas cuantas direcciones para dar nuestra página de alta, si añadimos clave al lado, tendremos más posibilidades de que nos salgan páginas relacionadas con la clave escrita.3. site:www.dominio.com -cadena: Suponiendo que 'cadena' no sale en ninguna página de www.dominio.com, google nos listará directamente todas las páginas que tenga indexadas de ese dominio.4. "+www.dominio.+.com": Lista todas las páginas en las que aparece la cadena exacta www.dominio.com.

Búsquedas en Google a través del e-mail

Hay ocasiones en que no se tiene acceso a navegar por Internet pero sí al e-mail, y un buen modo de adelantar trabajo es poder realizar una búsqueda en Google a través del correo electrónico.

Para esto sólo hay que enviar un mensaje a google-DE-capeclear.com, poner en el asunto las palabras clave de tu búsqueda y al poco tiempo recibirás los resultados de la búsqueda en tu buzón de correo electrónico.

Enlace directo:Más útil es la siguiente idea: almacena este enlace a Google por e-mail en tu escritorio. ¿Cómo?, haz click derecho sobre el enlace y pulsa en ->Copiar acceso directo, y luego haz click derecho sobre tu escritorio y pulsa en -> Pegar acceso directo.

Así tendrás creado un acceso directo a las búsquedas en Google, a tu alcance.

Las 100 webs más citadas de la red

Un par de datos muy curiosos: ¿Cómo saber cuáles son las webs más citadas de la red según google? Poned "http" (sin comillas) en la caja de búsqueda y voilà!:

- Las 100 webs más citadas en inglés.- Las 100 webs más citadas en castellano.

Una calculadora de PageRank

- Google PageRank Report- Google PageRank Prediction- Find out your Google PageRank easy!- Estimate your PageRank without the Google toolbar!- Check your Google PageRank using our Google PageRank calculator- Google pagerank analysis tool- Keyword Pagerank Finder- Google's PageRank - Calculator

Una aplicación para vigilar a googlebot

Para todos aquellos que necesitáis saber cómo, cuándo, etc., indexa googlebot vuestra web, gracias a Fernando os brindamos esta aplicación tan interesante, googlestats. Otra es RobotStats.

Está escrita en php y analiza en forma de estadísticas lo que hace googlebot cuando os visita

Posicionamiento web en Google

El posicionamiento en buscadores se ha convertido en los últimos tiempos en una de las herramientas más cotizadas por los webmasters. En particular, aparecer en las primeras posiciones en Google es algo indispensable si quieres generar tráfico hacia tu sitio web, ya que Google responde a casi el 60% de las búsquedas de Internet.

El tutorial que te proponemos te ayudará a conseguir un buen posicionamiento web, pero no esperes resultados en unos días, ni en unas semanas, ni quizá en meses. Se trata de un trabajo constante -generando contenidos, optimizando páginas web y buscando enlaces- cuyos resultados son a largo plazo.

1.- Buenos contenidos.Este es el punto principal, ya no solo para aparecer en los primeros puestos en Google, sino para que la gente visite tu sitio web.

2.- Tecnología web.Éstate informado de las últimas novedades en cuanto a servidores o lenguajes de programación. Te harán la tarea de gestionar los contenidos mucho más amena, y puedes "gustar más a Google".

3.- Sencillez.Al robot de Google no le gustan las páginas con excesivas decoraciones y simplemente busca textos legibles y contenidos claros.

4.- Alta en Google.El primer paso para conseguir una buena posición en Google es aparecer en el buscador. Descubre cómo hacerlo.

5.- Conseguir enlaces.Es el pilar fundamental para obtener un PageRank alto. Intenta aparecer en los principales directorios (Yahoo! y DMOZ) y que te enlacen desde otros sitios web.

6.- Evitar penalizaciones.Google sabe que muchas personas le intentan engañar, y está empezando a tomar medidas contra páginas web que realizan prácticas poco éticas para mejorar su posicionamiento. Infórmate de cuáles son y cómo evitarlas.

7.- Conseguir ayuda.El posicionamiento requiere estar informado constantemente.

Fuente: google.dirson.com

Historia del buscador Google

Historia de Google. Los comienzos- primavera 1995: Sergey Brin (23 años entonces) y Larry Page (24), confundadores de Google y actualmente presidente y CEO, se conocen en un acto que la Universidad de Stanford organiza para los candidatos de su Doctorado en Informática.

- otoño 1995: Larry y Sergey comienzan a trabajar en el 'Digital Library Project' de la Universidad de Stanford http://www-diglib.stanford.edu/. Larry Page, con experiencia en diseño web y el título de Ingeniero Eléctrico, y Sergey Brin, un experto en tratamiento de datos y Licenciado en Informática y Ciencias Matemáticas, comienzan a crear un algoritmo para la búsqueda de datos. Esta tecnología se convertirá mas tarde en el corazón que hará funcionar a Google.

El nombre que Larry Page da a esta tecnologia fue 'PageRank'. En su pagina web personal de la Universidad de Stanford, colgará en 1997 una presentacion que lo explica: 'PageRank: Bringing Order to the Web' http://hci.stanford.edu/~page/papers/pagerank/.

- enero 1996: Comienzan a desarrollar un buscador llamado 'BackRub' http://web.archive.org/web/19971210065425/backrub.stanford.edu/backrub.html. Este nombre se lo dan debido a que la mayor habilidad de este motor de búsqueda es analizar los 'back links' (enlaces que apuntan a una determinada página).

Tal y como indican en su descripción http://web.archive.org/web/19971210065425/backrub.stanford.edu/backrub.html, Backrub está escrito en Java y Python (incluso Larry Page postea alguna duda en los 'newsgroups' http://groups.google.com/groups?selm=page-0701962007020001%40qwerty.stanford.edu), y corre sobre varias máquinas Sun Ultra y Intel Pentium con Linux. La Base de Datos está alojada en un ordenador Sun Ultra II con 28GB de disco duro.

Si tienes cualquier duda sobre el funcionamiento de este buscador, y no está contestada en sus FAQ http://web.archive.org/web/19971210065437/backrub.stanford.edu/FAQ.html, puedes llamar al (415) 723-3154, y preguntar por Larry. Los primeros usuarios son los alumnos y profesores de Stanford, que disfrutan de la precisión con la que el buscador encuentra datos en la web.

- 1997: 'Backrub' se transforma en 'Google' http://web.archive.org/web/19971210065417/backrub.stanford.edu/. Le otorgan este peculiar nombre por su parecido a la palabra 'googol', que en inglés es el nombre que que se da a la cifra '10 elevado a 100' (un uno seguido de 100 ceros). Ya tienen indexadas 24 millones de páginas. Mucho antes, ya han tenido problemas de capacidad en sus discos duros, y han tenido que idear ingenios basados en Lego, como este http://www-db.stanford.edu/pub/voy/museum/pictures/display/0-4-Google.html.

En los comienzos de Google (en el dominio google.stanford.edu http://web.archive.org/web/19980502040303/google.stanford.edu/), su diseño es aún más austero de lo que será posteriormente. En esta antigua versión se incluyen fotografías de los equipos que utilizan http://web.archive.org/web/19980502040406/google.stanford.edu/googlehardware.html.

Historia de Google. Fundando una empresa- 1997: Larry y Sergey han registrado el dominio 'google.com'. Además, han dado a conocer su tecnología a la 'Office of Technology Licensing' (OTL) http://otl.stanford.edu/ de la Universidad de Stanford, que será la encargada de contactar con diferentes compañías de Internet que puedan estar interesadas en Google.

- enero 1998: A Sergey y Larry no les gusta ninguna de las ofertas recibidas, bien por ser económicamente bajas, o porque no van a desarrollar correctamente la tecnología. Por ello, deciden ser ellos los que creen su propia empresa.

Es entonces cuando el dormitorio de Larry Page se convierte en el nuevo hogar de Google, llevando todos los equipos informáticos junto a su cama. La habitación de Sergey Brin, situada al lado de la de Larry, se convierte en la oficina financiera.

Google sigue indexando paginas rápidamente, y Larry y Sergey necesitan mucha más capacidad en sus discos duros. Tienen que adquirir un terabyte, y finalmente consiguen comprar varios discos duros rebajados, todos por $15,000.

A pesar de la 'fiebre de los punto com' de aquellos días, Larry y Sergey no consiguen encontrar un inversor que financie Google, y tienen que conseguir todo el dinero de sus familias y amigos íntimos. Mientras tanto, habían abandonado su Doctorado en Stanford.

- verano 1998: En casa de un amigo común, Sergey y Larry conocen a Andy Bechtolsheim (cofundador de Sun Microsystems y vicepresidente de Cisco Systems), y comienzan a charlar sobre Google. Después de treinta minutos, Bechtolsheim les firma un cheque por $100,000, a nombre de 'Google Inc.'. Esta empresa, como tal, no existe, y para poder cobrar el cheque (que está dos semanas sobre la mesa de Larry), tienen que buscar un local, y fundar una nueva compañia: 'Google Inc.'.

- septiembre 1998: Google Inc. abre sus puertas en un garaje que un amigo les alquila en Menlo Park, en California. Rápidamente, instalan varias líneas telefónicas, un cable modem, una línea DSL, y una plaza de aparcamiento para su primer empleado, Craig Silverstein (actualmente, Director de Tecnologia de Google). 25 millones de páginas están indexadas (http://web.archive.org/web/19981111183552/google.stanford.edu), y Google recibe diez mil consultas por día. La revista 'PC Magazine' lo incluye dentro de su lista 'Top 100 Web Sites' de 1998.

- febrero 1999: La plantilla asciende a 8 personas, responde a 500.000 consultas por día, se trasladan a unas nuevas oficinas en Palo Alto, y firma su primer contrato comercial con RedHat, el cual empieza a suministrar el Sistema Operativo Linux de los servidores de Google. Mientras tanto, continúan con su campaña comercial: el boca a boca.

Fuente: google.dirson.com

Preguntas directas que tienen respuesta directa en Google

- Calculadora: (5 * 8) + 5 = 45- Radio de la tierra: radius of earth in km- 90 grados fahrenheit en centígrados: 90 fahrenheit in centigrade- Un día en segundos: one day in seconds- 1 hora * 128 kbps en megabytes: 1 hour * 128 kbps in megabytes

Servicio de comparación basado en Google

En Google Fight puedes comparar cara a cara dos conceptos para conocer cuál de ellos es más popular que el otro.Por ejemplo: Raúl vs Ronaldo

Google Bombing

¿Qué es un 'Google Bombing'?Se trata de conseguir que una determinada página web aparezca, en la búsqueda de una o varias palabras concretas, en la primera posición de los resultados de Google.

¿En qué consiste un 'Google Bombing'?Los promotores del 'Googlebombing' piden a los responsables de otros sitios web que inserten enlaces del tipo:

<A href=http://url_de_la_pagina>palabra1 palabra2</A>

El 'Google Bombing' se basa en el núcleo del funcionamiento de Google: los enlaces. Cuantos más enlaces obtenga una determinada página con una palabra (o palabras) en concreto, más posibilidades tendrá de aparecer en las primeras posiciones.

Incluso puede ocurrir que dentro de la página web objetivo del 'Google Bombing' no aparezca ni una sola vez las palabras de la búsqueda.

Se trata de la misma técnica que se utiliza en el posicionamiento web, pero enfocada en una reivincidación social o política.

¿Cuál es la finalidad de un 'Google Bombing'?Los promotores pretenden que se identifique al protagonista de la página web víctima del 'Google Bombing' con la palabra buscada. Así, cuando se promovió el 'miserable failure' contra George Bush, se perseguía que los usuarios de Google identificaran al presidente de EEUU con un 'miserable fracaso'.

¿Qué otros 'Google Bombings' han dado resultado?:: Petrolero Prestige:: John Kerry - 'waffles':: 'jew' ('judío'):: Jacques Chirac - 'magouilleur':: Jan Peter Balkenende - 'raar kapsel':: El príncipe holandés Willem-Alexander para la búsqueda slechte tanden ('dientes malos'), debido a su mal cuidada dentadura.:: 'Memorias de un Geek' propuso uno contra la SGAE, con la palabra 'ladrones'.:: "gafe" y sale ZP:: "miserable" y sale Acebes

 

Curiosidades

- El día 1 de abril de 2002 (April Fool's day), Google dio a conocer el PigeonRank (TM), el sistema que realmente clasifica las webs: miles de palomas trabajan ordenando todas los sitios web de Internet.

- En Pascua de 2001, aparecio un curioso juego (realizado en un applet de Java) sobre un conejito que recogía huevos de Pascua.

- En el Zeitgeist de Google vas a poder encontrar un montón de estadísticas: las palabras más buscadas de la semana en diferentes idiomas, los navegadores más utilizados, ... Además, tiene un archivo histórico.

- Google tiene varias ofertas de trabajo: técnicos en software o sistemas, ventas, marketing, finanzas, ... Además de entrar en una gran empresa tecnológica, un seguro médico, y un seleccionado menú para comer, te ofrecen alguna que otra fiesta como esta.

- La gente de Google tiene registrados las decenas de errores que los usuarios han cometido al intentar buscar uno de los nombres más buscados: el de Britney Spears.

- Google tiene registrados algunos dominios que se parecen al verdadero, los cuales difieren en alguna letra, y que -debido a que muchos usuarios escriben mal 'google'- llevan al sitio web correcto: gogle.com, googel.com, ggoogle.com o gogole.com.

- Incluso tiene registrado el dominio 466453.com (prueba a escribir 'google' en tu teléfono móvil). Google tiene varios servicios wireless en desarrollo.

- Otro April Fool's Day, pero de 2000, Google lanzó el sistema de búsqueda MentalPlex (TM), que era capaz de leer tu mente, y encontrar los resultados a la búsqueda que estabas pensando.

- Google organizó en 2002 un concurso de programación, que ofrecía diez mil dólares y una visita a la sede central de la compañía.

- Existe un curioso 'mirror' (servidor 'espejo') de Google: elgooG.

- El Googlewhacking es un 'deporte' que consiste en encontrar una pareja de palabras (que estén incluidas dentro del diccionario de inglés) que aparezcan una sola vez juntas en alguna página indexada por Google. Es decir, que buscándolas, obtengamos 'Resultados 1 - 1'.

- El comportamiento de Google durante los atentados en USA el 11 de septiembre de 2001 fue elogiado por muchos. Realizó 'cachés' de varios medios de comunicación (que en aquel momento estaban colapsados), y condujo muchas de sus búsquedas hacia noticias de actualidad.

- Tras la adquisición del archivo de noticias de Usenet que tenía la empresa Deja News, Google publicó una lista con los 'posts' referentes a los hechos más relevantes de la historia de Internet durante estos últimos años. Hay referencias a acontecimientos como las primeras menciones a Google o Yahoo, el primer post anunciando los ataques a las torres gemelas el 11 de setiembre de 2001, las primeras menciones a Linux o Microsoft, la primera discusión sobre el SIDA, ...

- El algoritmo de 'PageRank' está patentado en Estados Unidos con el número de patente '6,285,999', y con el título 'Method for node ranking in a linked database'.

- Si miramos el 'Acerca de...' de la 'Google Toolbar', vemos que -además de la versión- aparece la frase en latín 'De parvis grandis acervus erit', que podría traducirse como 'De las cosas pequeñas se hacen las cosas más grandes'. Esta frase fue utilizada en el siglo XVI en un libro de poemas.

- Para que nadie piense mal, las páginas de la tienda de Google (Google Store) tienen PageRank cero.

- Chad Lester, un trabajador de Google, recorrió en bicicleta en el año 2001 las más de 3500 millas que separan California de Florida. Répiclas del jersey que llevaba se vendieron en la GoogleStore.

Palabras más buscadas (Google Zeitgeist)

Sorpresas, pautas y tendencias de búsqueda según Google

Zeitgeist 2011: Qué es lo que ha buscado el mundo

http://www.google.es/press/zeitgeist.html

Anteriores:

Google Zeitgeist 2010

Google Zeitgeist 2009

Google Zeitgeist 2008

Google Zeitgeist 2007

Google Zeitgeist 2006

Google Zeitgeist 2005

Google Zeitgeist 2004

Google Zeitgeist 2003

Google Zeitgeist 2002

Google Zeitgeist 2001

http://www.google.es/press/zeitgeist/archive.html

Herramienta para palabras clave de AdWords de Google --> https://adwords.google.es/select/KeywordSandbox

Buscadores Específicos en Google

 

BSD Gobierno de USA Linux

MAC Microsoft Universidades

¿Cómo evito que Google busque en mi sitio?

Google utiliza "Robots" de busqueda, para evitar que los robots entren a tu sitio debemos hacer lo siguiente.

En la raiz de nuestro sitio, debemos poner un archivo de nombre "robots.txt"

Y dentro de este archivo podemos listar a donde no queremos que los robots del Google accedan.Miremos un momento el archivo, robots, alojado en www.google.com (asi es, google evita que su propio buscador acceda al mismo sitio, esto por seguridad.) Con Allow, permiten la busqueda y con Disallow la deniegan.

Respuestas directas en Google

La calculadora

Puedes combinar los resultados con otras funciones como el conversor de unidades.

Simplemente escribe la operación matemática en el buscador.

Ejemplo:

3 + 4 + 3452523 / 341 * 349587

El tiempo

Para saber el tiempo que hace puedes simplemente buscarlo en Google. Obtendrás una rápida predicción para cinco días.

 

En español: Tiempo ciudad En inglés: Weather ciudad

Ejemplo:

Tiempo Madrid

Conversión de divisas

Para hacerte una idea aproximada del valor de una moneda no necesitas bucear en complicada información bancaria. Con una búsqueda en Google, ya lo tienes.

 

En español: Cantidad Moneda_origen a Moneda_destino En inglés: Cantidad Moneda_origen to Moneda_destino

Ejemplo:

300 USD a Euro

Conversión de unidades

¿Tienes problemas para convertir unidades entre el sistema imperial y el sistema internacional? ¿No tienes ni idea de cuánto es una onza, 3 pies y 1/4 o 20 millas por hora? Con Google puedes convertir unidades rápidamente, directamente desde el buscador.

En español: Cantidad Unidad_origen a Unidad_destino En inglés: Cantidad Unidad_origen to Unidad_destino

Ejemplo:

300 millas a km

Cartelera de cine

Con Google puedes obtener una lista rápida de películas y cines de tu localidad gracias a Google Movies. Así te ahorras buscar cuáles son los cines cercanos, consultar sus páginas web...

 

En español: Cine ciudad En inglés: Cinema ciudad

Ejemplo:

Cine Salamanca

La bolsa

En estos momentos tan convulsos para la economía, no puedes descuidar tus acciones ni un segundo. ¿Cómo? Echando un vistazo a la Bolsa de vez en cuando, desde Google.¿Cómo se hace?

Simplemente escribe el código del valor, en mayúsculas.

Ejemplo:

AAPL

Salida y puesta del Sol

¿Te preguntas cuándo se pondrá el Sol en Badajoz? Lo más probable es que no, pero es un buen dato con el que impresionar a las visitas. Desde Google puedes consultar la hora de la salida y puesta del Sol de cualquier lugar del planeta.

 

Salida del Sol: salida del sol en ciudad Puesta del Sol: puesta del sol en ciudad

Ejemplo:

salida del sol en mexico df

Diccionario de definiciones

Para una consulta lingüística lo mejor es un diccionario, pero si sólo quieres hacer una comprobación rápida, lo único que necesitas es Google.

 

Define palabra

Ejemplo:

Define macarrones

Direcciones locales

¿Dónde puedes encontrar un taller mecánico cerca de tu ciudad? En Google Maps, por supuesto, pero también puedes conseguir un listado rápido directamente en los resultados de Google.

 

Lo-que-estás-buscando en ciudad

Ejemplo:

cerrajeros Valencia

Mapas

Está claro que Google dispone de Mapas, pero lo que quizá no sabes es que puedes usar el buscador para acceder los mapas topográficos de un lugar, resaltando el lugar en cuestión.

 

Mapa normal: Mapa ciudad Mapa de relieve: Mapa topográfico ciudad

Ejemplo:

mapa Francia

La hora en cualquier lugar del mundo

Con diferentes franjas horarias, a veces es complicado saber qué hora es exactamente en algún país remoto. Afortunadamente, Google puede calcularlo por ti.

 

Hora ciudad

Ejemplo:

Hora Japón

Datos estadísticos

El servicio Google Public Data es poco conocido. Es una base de datos públicos donde se hospedan datos de diversa índole: indicadores de desarrollo, tasa de desempleo en Europa, precios del combustible... Algunos de estos datos están disponibles directamente desde el navegador.

 

Introduce tu petición seguida del filtro que desees.

Ejemplo:

Producto interior bruto Japon

Traducciones

Todo el mundo conoce el traductor de Google, pero ¿sabías que también puedes traducir directamente desde Google?

 

Translate to idioma lo-que-quieres-traducir

Ejemplo:

Translate to german Me gusta el fútbol

 

Conexiones GSM, GPRS, 3G+, UMTS, HSDPA

Definiciones

GSM son las siglas de Global System for Mobile communications (Sistema Global para las comunicaciones Móviles), es el sistema de teléfono móvil digital más utilizado y el estándar de facto para teléfonos móviles en Europa. La mayoría de las redes GSM utilizan 900MHz y 1800MHz en los EE.UU., pero la 850MHz y 1900Mhz ocupan un lugar destacado. El teléfono es un teléfono de triple banda y puede ser utilizado en Europa, los EE.UU. y muchos otros territorios (a condición de la tarjeta SIM está activado). Si usted necesita el acceso móvil en el Lejano Oriente y zonas como Escandinavia tendrá que verificar con su proveedor de servicios móviles debido que se necesita como mínimo un teléfono de cuádruple banda y se requiere en algunas zonas sólo un teléfono comprado en el país funcionara.

La mayoría de los teléfonos GSM se utilizan principalmente para voz, pero puede ser utilizado para acceso móvil a Internet a través de la red básica de GPRS.

GPRS, General Packet Radio Service o servicio general de paquetes vía radio es una extensión del Sistema Global para Comunicaciones Móviles (Global System for Mobile Communications o GSM) para la transmisión de datos no conmutada (o por paquetes). Existe un servicio similar para los teléfonos móviles que del sistema IS-136. Permite velocidades de transferencia de 56 a 144 kbps. Permite como mucho 80 Kbps, o sea 0,08 “Megas” de velocidad. Similar a un viejo moden telefónico de los que ya no se usan- GPRS es un sistema probado y por lo tanto es muy confiable para el uso estándar de datos móviles y se ajusta a las personas con moderadas necesidades de datos. Una vez que haya realizado los ajustes necesarios en su lugar puede utilizar la red siempre que lo desee y que no requiere ningún otro ajuste, ya que funciona en el fondo de sus aplicaciones de Internet.

EDGE o EGPRS, Enhanced Data rates for GSM of Evolution (Tasas de Datos Mejoradas para la evolución de GSM), es decir, el anterior mejorado, permite has un máximo de conexión de 236 Kbps, es decir 0,236 “Megas”. Es un reciente desarrollo basado en el sistema GPRS y ha sido clasificado como un «3G» estándar debido a que puede funcionar en un máximo de 473,6 kbits por segundo. Si un teléfono inteligente es compatible con EDGE puede ser utilizado para la transmisión de datos móviles pesados, tales como la recepción de grandes archivos adjuntos de correo electrónico y navegar por páginas web complejas a gran velocidad. Para utilizar EDGE, las torres de celular deben de ser modificadas para aceptar las transmisiones de este tipo de cobertura puede ser tan irregular en algunas zonas-que es una tecnología que vale la pena haber construido en cualquier teléfono.

3G o UMTS, Universal Mobile Telecommunications System, la tercera generación de sistemas para móviles (3G).. Los servicios asociados con la tercera generación proporcionan la posibilidad de transferir tanto voz y datos (una llamada telefónica) y datos no-voz (como la descarga de programas, intercambio de email, y mensajería instantánea).Permite velocidades de conexión de hasta 2 Mbps (2 megas en el lenguaje coloquial) pero esto sólo en condiciones óptimas, claro. Ahora mismo con esta conexión en 3G le he hecho un Speedtest y no pasa de 0,4 Mbps con una señal de recepción ”dos rayitas” sobre 5.

HSDPA , (High Speed Downlink Packet Access) es la optimización de la tecnología espectral UMTS/WCDMA, pudiendo alcanzar velocidades de bajada de hasta 14 Mbps en teoría en condiciones óptimas, pero yo solo he conseguido 1 Mbps con la mejor señal posible. Tal vez este sea el límite actual que nos ofrece el sistema de Internet móvil..La tecnología HSDPA (High Speed Downlink Packet Access), también denominada 3.5G, 3G+ or turbo 3G, es la optimización de la tecnología espectral UMTS/WCDMA, incluida en las especificaciones de 3GPP release 5 y consiste en un nuevo canal compartido en el enlace descendente (downlink) que mejora significativamente la capacidad máxima de transferencia de información pudiéndose alcanzar tasas de hasta 14 Mbps. Soporta tasas de throughput promedio cercanas a 1 Mbps

HSUPA , (High-Speed Uplink Packet Access o Acceso ascendente de paquetes a alta velocidad) es un protocolo de acceso de datos para redes de telefonía móvil con alta tasa de transferencia de subida (de hasta 7.2 Mbit/s). Calificado como generación 3.75 (3.75G) o 3.5G Plus, es una evolución de HSDPA (High-Speed Downlink Packet Access, Acceso descendente de paquetes a alta velocidad, nombrado popularmente como 3.5G). La solución HSUPA potenciará inicialmente la conexión de subida UMTS/WCDMA (3G). HSUPA está definido en Universal Mobile Telecommunications System Release 6 estándar publicado por 3GPP (www.3GPP.org), como una tecnología que ofrece una mejora sustancial en la velocidad para el tramo de subida, desde el terminal hacia la red. HSDPA y HSUPA, ofrecen altas prestaciones de voz y datos, y permitirá la creación de un gran mercado de servicios IP multimedia móvil. HSUPA mejorará las aplicaciones de datos avanzados persona a persona, con mayores y más simétricos ratios de datos, como el e-mail en el móvil y juegos en tiempo real con otro jugador. Las aplicaciones tradicionales de negocios, junto con muchas aplicaciones de consumidores, se beneficiarán del incremento de la velocidad de conexión.

Consumo de Batería H, 3G ,G, E

G = GPRS + ó - 1.5 MbE = Edge 1.7 Mb3G = 3G 2 Mb+3G = +3G 2.5 MbH = HSDPA Hasta 7.2 Mb

HSDPA -> 3.5G3G -> 3GEDGE -> 2.5GGSM/GPRS -> 2G

GSM/WCDWA -> MODO AUTOMÁTICO. Si tienes cobertura tendras 3G o H, si no E o GSolo GSM -> Solo E o GSolo WCDMA -> Solo 3G o H

El HSDPA consume mucho más batería que el WIFI. El HSDPA es una tecnologia multicanal. Utiliza varios canales tanto en la transmisión como en la recepción (similiar a la tecnologia de MIMO del WIFI), para lograr mayores tasas de velocidades. El uso de canales adicionales implica mayores consumo de energía.

Si tenéis una cobertura mediocre en HSDPA y resulta que el móvil va cambiando cada dos por tres entre 3G y H, lo mejor para ahorrar más batería es desactivar el modo HSDPA porque la mayoría de veces no se suele notar demasiado incremento en velocidad (muchas tarifas 3G van capadas en cuanto a velocidad) y está demostrado que cuando sale una H se consume casi el doble de batería que si hay sólo 3G.

Tanto con el G, 3H y HSDPA puedes entrar a internet, enviar y recibir mms y videollamadas, lo unico que cambia es la velocidad de transferencia de datos

El tipo de datos 2g/3g óptimo dependerá de el uso que hagas:- 2G: consume menos batería en stand by, pero más en envío y recepción.- 3G: consumo más batería en stand by, pero menos en envío y recepción.

Desactivar HSDPA si no se necesita, otra forma de ahorrar

Ejemplo: Samsung Galaxy S

Si tenéis una cobertura mediocre y resulta que el móvil va cambiando cada dos por tres entre 3G y H, lo mejor para ahorrar más batería es desactivar el modo HSDPA porque la mayoría de veces no se suele notar demasiado incremento en velocidad (muchas tarifas 3G van capadas en cuanto a velocidad) y está demostrado que cuando sale una H se consume casi el doble de batería que si hay sólo 3G.

Así pues, si queréis desactivar el HSDPA, seguid estos pasos:

En el marcador telefónico escribid: *#301279#Se os abre un menú. Seleccionad CHANGE HSPA VERSIONY aquí, RELEASE 99 (HSPA OFF)

Salid con la tecla atrás o como queráis. Ya no tenéis HSDPA...

Si por lo que sea queréis volver a tener HSDPA, el proceso es reversible de forma similar:

En el marcador telefónico escribid: *#301279#Se os abre un menú. Seleccionad CHANGE HSPA VERSIONY aquí, RELEASE 6 (HSDPA/HSUPA)

 

Conexiones con el smartphone

Conexión en itinerancia: este icono aparece cuando salimos de nuestro país y conectamos a la red de algun operador de otro país. Hay que ir con cuidado porque las tarifas son abusivas. Una cosa muy importante a hacer es ir a la configuración de las

redes móviles y desmarcar la opción "Conectar con redes en itinerancia". También se les conoce como Roaming.Conexión 2G sin datos: es la conexión que deberías de tener si no tienes buena cobertura o si no tienes contratada una tarifa mensual de internet en el móvil. Con este icono no podrás usar los servicios de transmisión de datos como Internet, correo electrónico...Conexión 2G GPRS: es la conexión de datos más lenta, de unos miserables 6 KB/s (equivalente a una conexión módem antigua de 56 kbps). No vale la pena navegar en GPRS, ya que, literalmente, puedes ir al baño mientras carga.Conexión 2.5G (EDGE): es una mejora del GPRS, que permite navegar a velocidades más aceptables que el GPRS, pero sin llegar, ni de lejos, a las conseguidas por las 3G.Conexión 3G (UMTS): 3G y UMTS son palabas sinónimas; tiene una cobertura de entre el 70 y el 85% y te permite navegar a alta velocidad.Conexión 3.5G (HSPA): la tecnología HSPA es la más rápida de la actualidad (en el mercado español) y permite velocidades de hasta 7Mbps de bajada (HSDPA) y 2 Mbps de subida (HSUPA). Está presente en los núcleos urbanos sobretodo y suele representarse con el icono H.

 

Tipo de red preferido

 

Marcar este código: *#*#4636#*#*

Luego en la "Información sobre el teléfono" bajamos hasta "Establecer tipo de red preferido"

Resumen:

WCDMA preferred: Utiliza 2G y 3G. Aunque la señal sea débil, busca siempre la mejor forma de establecer conexión vía 3G.

GSM only: Utiliza 2G. Si la señal es débil, no utiliza ninguna. WCDMA only: Utiliza 3G. Si la señal es débil, no utiliza ninguna. GSM auto (PRL): Utiliza 2G y 3G. Si la señal es débil, usa 2G.

Explicación:

GSM only: Si no necesitas conexiones rápidas ésta es la opción que más ahorro de batería producirá conectándote principalmente a las redes 2G

GSM auto (PRL): Un buen equilibrio entre velocidad y batería: Intentará usar redes 3G pero no estará constantemente buscando Conexiones mejores.

WCDMA Only: Si vives en un sitio con poca covertura GSM pero buena covertura HSDPA ésta es la opción que te interesa. Gasta más batería que en la anterior.

WCDMA preferred: Gasta menos batería que el únicamente WCDMA. WCDMA only: El que gasta más batería buscando únicamente la conexión más

rápida.

Por defecto, la selección suele ser WCDMA preferred, donde buscamos la mayor velocidad posible a cualquier precio. Sin embargo, la GSM auto puede ser una buena estrategia para reducir esas búsquedas (y gasto de batería) a favor de sacrificar un poco la cobertura.

Calibrar la bateria

Ccalibrar NO hace que dure mas, hace que el indicador de la bateria muestre fielmente lo que te queda de bateria, pero no hace que dure mas.

Si la tienes calibrada... tanto al principio como al final de la duración el % se ajusta a la carga real.

Si no esta calibrada...no marca lo que le queda, pero al final de su duracion se empieza a "parecer" más, y el ultimo 10% mas o menos ya si es real lo que marca con lo que queda.

En resumen: Que si, que es bueno calibrar, pero no os durara mas.

Consumo de la batería y recarga

Piensa que las baterias que incorporan nuestros moviles no tienen efecto memoria como tal, si es cierto que con el tiempo pierden capacidad de tension , y por lo tanto de duración.

Ahora, el sistema es otra cosa, probablemente cuando hicistes el wipe no estaba 100 % cargada , entonces el movil se cree que tiene menos bateria de la que tiene. La prueba de esto es facil, cuando veas que de repente te baja un 20 % reinicia el movil, veras como por arte de magia el % cambia, haz esto un par de veces hasta que el movil ya no encienda de verdad .

Una vez que le movil este totalmente muerto , cargalo sin encenderlo , cuando este full arrancalo, y que siga cargando, cuando este full vuelve a apagarlo y deja que se vuelva a cargar ...y esto repetitivo hasta que veas que simplemente pasan 2 segundo o es practicamente inmediato en sonarte el lleno ... entonces entra en recovery y haz el wipe . resetealo ( bajo mi punto de vista con el cargador enchufado, mas tarde explico el porque ) y espera que se cargue del todo , ahi desenchufalo y empieza tu vida de forma normal :-)

Lo de reiniciar tantas veces es por que una cosa es lo que la bateria puede almacenar y lo que el sistema cree que ha almacenado, a las baterias de litio es muy dificil hacerlas daño por intentar alamacenar de mas, y asi te aseguraras de que verdad a cogido la tension adecuada.

Respecto al cable enchufado, aqui hay diferencia de opiniones, por lo que yo se las baterias de litio tienen un pico de aguante muy superior al valor nominal que entregan ( en el caso de las samsung mas ya que los cargadores estan "trucados" casi 0.3 A para que algunos cargadores chinos no carguen ) por lo que si lo dejas arrancar sin cargador

elmovil entendera que ese es el maximo pico de almacenaje , sin embargo con el cable enchufado entregaras un 8% mas , que luego el sistema intentara cargar ...

Suerte y a disfrutar ... y no olvidarse que estos moviles son muy modernos, pero las baterias poco potentes asi que el cargarlo a diario es imprencindible y que estas baterias duran mas si no bajan de un 40-20 % de carga cuando las pones a cargar ( por el mismo rollo de la tension ) "

Trucos Mozilla Firefox

Esta página contiene varios trucos para el Mozilla Firefox. La mayoría de estos tips requieren el editar archivos en su disco duro, algo que no es recomendado si no está familiarizado con el uso básico de archivos y carpetas. Los trucos se dividen en cuatro categorías y están ordenados por importancia/popularidad.

Contenidos

Libera memoria del navegador Apariencia del Navegador

o Usar los menús con el estilo de Windows XP o Usar los menús con el estilo de Windows clásico (9x/Me/2000) o Use su propia imagen de fondo para las barras de herramientas o Haga la tab activa más fácil de distinguir o No usar negritas en la tab activa o Quitar el botón de cerrar de la barra de tabs o Remover ítems del menú principal o Cambiar el icono de ventana o Mostrar la sidebar a la derecha o Cambiar el ancho de barra de búsqueda

Comportamiento del Navegador o Abrir links externos en nuevas ventanas o tabs o Siempre mostrar la barra de tabs o Siempre mostrar el Stylesheet Switcher o Deshabilitar target="_blank" o Desactivar el cambiar tamaño de imágenes automáticamente o Usar páginas de error en vez de ventanas de diálogo o Usar la siderbar de descargas en vez de ventanas de progreso o Modificar 'Encontrar Mientras Tipea' o Desplazamiento suavizado o Deshabilitar otras características de JavaScript o Usar los favoritos de Netscape 6/7 o Mozilla en Mozilla Firefox o Cambien el modo de búsqueda en la barra de direcciones

o Deshabilitar favicones en favoritos o Cambiar la URL del Indicador de Actividad o Prevenir que las URLs sean guardadas en la barra de direcciones

Apariencia de las Páginas Web o Bloqueo de Publicidad o Desactivar elementos parpadeantes o Deshabilitar tags de o Forzar a los frames poder cambiar de tamaño o Cambiar el puntero para los links que abren en nuevas ventanas o Cambiar el puntero para links de JavaScript

Otros Trucos o Cambiar el lenguaje en páginas web o Seleccionar y copiar individualmente celdas de tablas o Acelerar el renderizado de páginas o Habilitar Pipelining o Especificar donde guardar el cache o Especificar el uso de la memoria cache o Acceder a más preferencias o Navegador en modo Kiosk o Limitar Mozilla Firefox a una cantidad especifica de sitios web

Libera memoria de Firefox.

Un sencillo truco que nos permitirá liberar memoria de Firefox, simplemente minimizándolo.

Todos sabemos que Firefox es bastante glotón en cuanto al consumo de memoria.

Gracias a este sencillo truco podremos hacer que Firefox libere memoria cuando su ventana sea minimizada:

1. En la barra de direccion escribe about:config y presiona Enter.2. Haz click con el botón derecho sobre la página, y seleccionar "Nuevo"3. En la ventana que aparezca escribid: config.trim_on_minimize4. Seleccionar "True" y presionar Enter5. Finalmente reiniciar Firefox.

Destacar que el truco tan solo vale para Windows.

Apariencia del Navegador

Usar los menús con el estilo de Windows XP

Si está usando Windows XP y quiere que sus menús se vean como el estilo por defecto (Luna), añada el siguiente código a su archivo userChrome.css:

/* Hacer menus con estilo XP */menupopup, popup {border: 1px solid ThreeDShadow !important;-moz-border-left-colors: ThreeDShadow !important;-moz-border-top-colors: ThreeDShadow !important;-moz-border-right-colors: ThreeDShadow !important;-moz-border-bottom-colors: ThreeDShadow !important;padding: 1px !important;background-color: Menu !important;}menubar > menu {border: 1px solid transparent !important;padding: 2px 5px 2px 7px !important;margin: 0 !important;}menubar > menu[_moz-menuactive="true"] {background-color : Highlight !important;color: HighlightText !important;}

Usar los menús con el estilo de Windows clásico (9x/Me/2000)

Desafortunadamente, el menú por defecto actual de Mozilla Firefox es algo así como una mezcla entre el estilo plano de Windows XP y la apariencia 3D de otras versiones de Windows. Si quiere que los menús tengan la apariencia nativa de Windows clásico, añada el siguiente código a su archivo userChrome.css:

/* Menus con estilo Windows Clasico (9x/Me/2000) */menupopup, popup {border: 2px solid !important;-moz-border-top-colors: ThreeDLightShadow ThreeDHighlight;-moz-border-right-colors: ThreeDDarkShadow ThreeDShadow;-moz-border-bottom-colors: ThreeDDarkShadow ThreeDShadow;-moz-border-left-colors: ThreeDLightShadow ThreeDHighlight;padding: 1px !important;}menubar > menu[disabled="true"] {border: 1px solid transparent !important;}menubar > menu[_moz-menuactive="true"] {border-top: 1px solid ThreeDHighlight !important;border-right: 1px solid ThreeDShadow !important;border-bottom: 1px solid ThreeDShadow !important;border-left: 1px solid ThreeDHighlight !important;background-color: transparent !important;color: MenuText !important;}menubar > menu[_moz-menuactive="true"][open="true"] {

border-top: 1px solid ThreeDShadow !important;border-right: 1px solid ThreeDHighlight !important;border-bottom: 1px solid ThreeDHighlight !important;border-left: 1px solid ThreeDShadow !important;}

Use su propia imagen de fondo para las barras de herramientas

Además de poder cambiar themes, se puede personalizar Mozilla Firefox aún más, usando su propia imagen de fondo para la barra de herramientas. Añada el siguiente código a su archivo userChrome.css:

/* Usar una imagen de fondo para las barras de herramientas:(cambie su imagen por background.gif) */

menubar, toolbox, toolbar, .tabbrowser-tabs {background-image: url("background.gif") !important;background-color: none !important;}

Es más fácil si pone esta imagen en la misma ubicación del archivo userChrome.css. La imagen puede ser en cualquier formato soportado Mozilla Firefox.

Hacer la tab activa más fácil de distinguir

Para hacer de la tab activa más fácil de distinguir entre las demás, puede cambiar el color de las tabs. Añada el siguiente código a su archivo userChrome.css:

/* Cambiar el color de la tab activa */tab[selected="true"] {background-color: rgb(222,218,210) !important;color: black !important;}

/* Cambiar el color de la tab normal */tab {background-color: rgb(200,196,188) !important;color: gray !important;}

No usar negritas en la tab activa

Si no quiere que el título de la tab activa esté en negritas, añada el siguiente código a su archivo userChrome.css:

/* Hacer de la tab activa mas fácil de distinguir: */tab[selected="true"] {

font-weight: normal !important;}

Quitar el botón de cerrar de la barra de tabs

Puede quitar el botón de cerrar de la barra de tabs añadiendo el siguiente código en su archivo userChrome.css:

/* Remover el boton de cerrar de la barra de tabs */.tabs-closebutton {display: none !important;}

Aún podrá cerrar las tabs haciendo click derecho en ellas y seleccionando Cerrar Tab, Haciendo click con el botón del medio, o presionando Ctrl+W

Remover ítems del menú principal

A algunas personas les gusta poner todos los objetos del navegador en la misma barra que el menú. Para salvar espacio horizontal, puede remover los menús que no use. Añada el siguiente código a su archivo userChrome.css:

/* Remover los menus de Ir y Ayuda */menu[label="Go"],menu[label="Help"] { display: none !important; }

Cambiar el icono de ventana

El icono por defecto de Mozilla Firefox es un fuego rojo, pero algunos sistemas operativos muestran el icono por defecto del sistema. Puede cambiar este icono cuando quiera, siguiendo estos simples pasos:

1. Vaya a la carpeta donde instalo Mozilla Firefox (ej. >C:\Archivos de programa\Mozilla Firefox\) y luego a la sub carpeta chrome.

2. En la carpeta chrome, cree una nueva carpeta llamada icons, luego entre a esta carpeta y cree otra carpeta dentro, llamada default.Entonces la dirección completa ahora seria C:\Archivos de programa\Mozilla Firefox\chrome\icons\default\ (según donde tenga instalado Mozilla Firefox)

3. Escoja el icono que desea usar (en Windows use archivos .ico, en Linux use archivos .xpm) y luego ponga el archivo en esta carpeta y renómbrelo main-window.[tipodearchivo], ej. main-window.ico en Windows y main-window.xpm en Linux.

Aparte de la ventana principal, puede cambiar los iconos para el administrador de favoritos y la consola JavaScript. Los nombres de iconos son bookmark-window.[tipodearchivo] and jsconsoleWindow.[tipodearchivo], respectivamente.

Después de hacer esto, reinicie Mozilla Firefox y debería poder ver el icono elegido a la izquierda del título de la ventana. Un bonito icono para Windows hecho por el autor del theme default en Mozilla Firefox puede ser encontrado aquí.

De forma alternativa, puede simplemente descargar la extensión Fb Window Icon Adder, la que añadirá iconos diseñados por Lim Chee Aun.

Mostrar la sidebar a la derecha

Para mostrar la sidebar a la derecha en vez de la izquierda, añada el siguiente código a su archivo userChrome.css:

/* Place the sidebar on the right edge of the window */window > hbox {direction:rtl;}window > hbox > * {direction:ltr;}

Cambiar el ancho de barra de búsqueda

por defecto, la barra de búsqueda es relativamente pequeña. Para especificar uno mismo el ancho en pixeles, añada el siguiente código a su archivo userChrome.css:

/* Make the Search box flex wider */#search-container {-moz-box-flex: 400 !important;}

« Subir

Comportamiento del Navegador

Abrir links externos en nuevas ventanas o tabs

Si otro programa quiere mostrar una página web en el navegador por defecto, Mozilla Firefox por defecto usará una ventana existente, lo que significa que usará una página que usted podría estar leyendo. Para evitar esto, añada el siguiente código a su archivo user.js:

// Dejar de rehusar ventanas activas:user_pref("advanced.system.supportDDEExec", false);

¿Que tal nuevas tabs en vez de ventanas? Si prefiere usar tabs en vez de ventanas, debe instalar Tabbrowser Extensions, una extensión muy poderosa que mejora la navegación por tabs. Despues de instalar la extensión, siga estas instrucciones:

1. Asegurase de no haber olvidado añadir el código de arriba a su archivo user.js.

2. Seleccione Herramientas > Extensiones, selecciones Tabbrowser Extensions y haga click en Opciones.

3. Expanda la lista de categorias y seleccione el primer sub-item (deberia decir Advanced Tabbed Browsing pero la lista es demasiado angosta).

4. En la lista Window Mode, seleccione Use multiple browsers only when I open them.

¡Listo! Ahora cualquier link abierto por un programa externom, como su cliente de e-mail, abrirá en una nueva tab.

Siempre mostrar la barra de tabs

La barra de tabs normalmente no aparece cuando solo una tab existe en la ventana. Para hacer que la barra aparezca visible todo el tiempo, añada el siguiente código a su archivo user.js:

// Deshabilitar la función de auto-esconder barra de tabs user_pref("browser.tabs.autoHide", false);

Nótese que aún podrá esconder manualmente la barra de tabs en una ventana, haciendo click en el botón de Cerrar Tab X cuando solo una tab se encuentre abierta.

Desde Mozilla Firefox 0.6.1 en adelante, esta opción en encuentra en la Ventana de Opciones, bajo el panel Avanzado.

Siempre mostrar el Stylesheet Switcher

El icono del Stylesheet Switcher en la barra de estado normalmente no aparece en sitios donde solo no hay mas que un stylesheet disponible. Para forzar al icono para que este visible todo el tiempo, añada el siguiente codigo a su archivo userChrome.js:

/* Siempre mostrar el icono del Stylesheet Switcher */#page-theme-button {display: -moz-box !important;list-style-image: url(chrome://browser/skin/page-themes.png);padding: 0px 3px;}

Nota: esta función solo esta disponible desde Mozilla Firefox 0.6.1+ en adelante.

Deshabilitar target="_blank"

Mozilla Firefox incluye un bloqueador de pop-up que está activado por defecto. Sin embargo, no evita que páginas web se abran en ventanas nuevas usando el tag target="_blank" o el tag ilegal target="_new". Para forzar a tales links de abrir en la misma ventana , añada el siguiente código en archivo user.js:

// deshabilitar target="_blank" (abrir en la misma ventana):user_pref("browser.block.target_new_window", true);

Desactivar el cambiar tamaño de imágenes automáticamente

Cuando esta función se encuentra encendida, automáticamente achica cualquier imagen que sea más grande que la ventana, para que así toda la imagen sea visible. Cuando esto ocurre, el cursor cambia para avisar que al hacer click la imagen vuelve a su tamaño original. Para apagar esta función, añada el siguiente código a su archivo user.js:

// desactivar cambio de tamaño en imágenes: user_pref("browser.enable_automatic_image_resizing", false);

En versiones recientes de Mozilla Firefox (0.6.1 en adelante), esta función puede ser accedida bajo la Ventana de Opciones, en el panel Avanzado.

Usar páginas de error en vez de ventanas de diálogo

Por defecto, Mozilla Firefox mostrará un mensaje de error cuando la conexión falla, en vez de mostrar una página con información sobre el error, como lo hace Internet Explorer. Para desactivar los mensajes y usar páginas de error, añada el siguiente código a su archivo user.js:

// En vez de mensajes de error, mostrar paginas:user_pref("browser.xul.error_pages.enabled", true);

Nótese que esta opción aun no funciona completamente bien, ya que borra la ultima página visitada del botón de volver atrás.

Usar la siderbar de descargas en vez de ventanas de progreso

Por defecto, Mozilla Firefox muestra ventanas de progreso cuando uno baja archivos. Si baja muchos archivos al mismo tiempo, estas ventanas pueden llenar su barra de inicio y escritorio. Para usar la Sidebar de descargas en vez de las ventanas, añada al siguiente código a su archivo user.js:

// En vez de ventanas de progreso, usar la Sidebar:user_pref("browser.download.openSidebar", true);user_pref("browser.download.useProgressDialogs", false);

Modificar 'Encontrar Mientras Tipea'

Encontrar Mientras Tipea (Find As You Type), una función relativamente nueva en Mozilla, tiene unas cuentas opciones escondidas que pueden ser cambiadas a gusto. Añada los siguientes códigos a su archivo user.js:

// Configuración de Find As You Type:// Deje esta opción como false para deshabilitar Find As You Type:

user_pref("accessibility.typeaheadfind", true);// Si deja esta opción como true, al tipear automáticamente se habilitara Find As You Type. // Si deja false, debe apretar / (encontrar texto) o ' (encontrar links) antes de buscar.user_pref("accessibility.typeaheadfind.autostart", true);// Deje esta opciones en false si quiere usar Find As You Type para buscar texto normal también:user_pref("accessibility.typeaheadfind.linksonly", true);// Deje esta opción en true para buscar solo links que empiecen con el texto tipeado:user_pref("accessibility.typeaheadfind.startlinksonly", false);// Este es el tiempo en milisegundos para que Find As You Type deje de vigilar su tipeo:user_pref("accessibility.typeaheadfind.timeout", 3000);

Para más información sobre que es Find As You Type, lea la documentación (en inglés).

Versiones recientes de Mozilla Firefox permiten activar o desactivar Encontrar Mientras Tipea, así como elegir solo buscar links, en la ventana de Opciones, bajo el panel Avanzado

Desplazamiento suavizado

Mozilla Firefox 0.6 tiene la función de Desplazamiento suavizado (Smooth Scrolling) habilitada por defecto. Los últimos builds nocturnos tienen esta opción deshabilitada. Para habilitar o deshabilitar esta función, añada el siguiente código a su archivo user.js:

// Smooth Scrolling (true = encendido, false = apagado):user_pref("general.smoothScroll", true);

En versiones recientes (después de Mozilla Firefox 0.6.1), esta función puede ser accedida en la ventana de Opciones, bajo el panel Avanzado.

Deshabilitar otras características de JavaScript

Mozilla Firefox tiene unas cuantas opciones que le permiten decidir que pueden hacer o no hacer los scripts con las ventanas. Estas opciones están disponibles desde Herramientas > Opciones > Opciones Web > Avanzado. Sin embargo, esta lista no es completa. Hay otras opciones útiles que pueden ser cambiadas añadiendo el siguiente código a su archivo user.js:

// More DOM/JavaScript options

// Make sure all pop-up windows are resizable:user_pref("dom.disable_window_open_feature.resizable", true);

// Make sure all pop-up windows are minimizable:user_pref("dom.disable_window_open_feature.minimizable", true);

// Always display the menu in pop-up windows:user_pref("dom.disable_window_open_feature.menubar", true);

// Always display the Navigation Toolbar in pop-up windows:user_pref("dom.disable_window_open_feature.location", true);

Usar los favoritos de Netscape 6/7 o Mozilla en Mozilla Firefox

Si usa 6/7 o Mozilla, puede compartir sus favoritos con Mozilla Firefox. Todos los favoritos son guardados en un archivo llamado bookmarks.html y es guardado en la carpeta de su perfíl. Por ejemplo, si quiere usar los favoritos de Netscape 7 en Mozilla Firefox, añada el siguiente código a su archivo user.js:

// Definir que favoritos usar:user_pref("browser.bookmarks.file", "C:\\Carpeta a perfil de Netscape\\bookmarks.html");

Recuerde usar dos backslashes (el símbolo "\") para separar el path si usa Windows, ej. C:\\Path\\bookmarks.html en vez de C:\Path\bookmarks.html.

Cambien el modo de búsqueda en la barra de direcciones

Por defecto, si entra un termino de búsqueda en la barra de direcciones y aprieta Enter, una búsqueda por Google usando "Voy a Tener Suerte" es llevada a cabo, y será llevado al primer sitio resultante de esa búsqueda. Si prefiere ver la lista de resultados estandard, añada el siguiente código a su archivo user.js:

// Cambiar a búsqueda normal de Google:user_pref("keyword.URL", "http://google.com/search?btnG=Google+Search&q=");

Por supuesto, también podría cambiar a un buscador totalmente diferente cambiando la dirección a otro sitio. La dirección por defecto es: "http://www.google.com/search?btnI=I%27m+Feeling+Lucky&q=".

Deshabilitar favicones en favoritos

Puede deshabilitar los iconos y "favicones" de los favoritos añadiendo el siguiente código a su archivo user.js:

// Deshabilitar iconos de favoritosuser_pref("browser.chrome.site_icons", false);user_pref("browser.chrome.favicons", false);

Cambiar el indicador de actividad de URL

Cuando hace click en el Indicador de Actividad (también conocido como "throbber"), es dirigido al sitio oficial de Mozilla Firefox en inglés. Esto puede ser cambiado a cualquier dirección añadiendo el siguiente código a su archivo user.js:

// Click en el throbber va a Mozilla.org:user_pref("browser.throbber.url", "http://www.mozilla.org/");

Prevenir que las URLs sean guardadas en la barra de direcciones

Mozilla Firefox permite evitar que las URLs sean guardadas en menú desplegable de la barra de direcciones. Esta restricción ayuda a proteger la privacidad del usuario y previene que los usuarios "tropiecen" con sitios visitados por otros usuarios.

« Subir

Apariencia de las Páginas Web

Bloqueo de Publicidad

La publicidad en sitios web es molesta, y frecuentemente puede "romper" el texto y parpadear para obtener su atención. Hay un truco genial que puede usar para bloquear la mayoría de la publicidad en sitios web.

Debido al largo del código en este tip, se encuentra disponible por separado en esta página.

Deshabilitar elementos parpadeantes

Probablemente encuentre el parpadeo de arriba molesto. Para detenerlo, añada el siguiente código a su archivo user.js:

// Fin al texto parpadeante!user_pref("browser.blink_allowed", false);

Deshabilitar tags de

Algunos sitios usan tags de marquee (texto que se desplaza por la página, ejemplo un poco más abajo). Si no los encuentra muy útiles, añada el siguiente código a su archivo de userContent.css:

/* Detenga los tags de

! */marquee {-moz-binding : none !important;display : block;height : auto !important;}

Si añade el código, este texto no deberia desplazarse luego de reiniciar Mozilla Firefox.

Forzar a los frames poder cambiar de tamaño

Muchos sitios usan frames para mostrar sus contenidos, y algunas veces los frames son demasiado pequeños. Para forzar a todos los frames poder cambiar de tamaño, añada el siguiente código a su archivo user.js:

// Forzar frames a cambiar tamañouser_pref("layout.frames.force_resizability", true);

Notese que esto también hara que los frames aparescan con un borde fijo y puede hacer que las páginas se vean raras.

Cambiar el puntero para los links que abren en nuevas ventanas

Este truquillo cambiará el puntero del mouse cuando lo ponga sobre links que abran en una ventana nueva. añada el siguiente código a su archivo userContent.css:

/* Cambiar puntero para links que abren en nueva ventana */:link[target="_blank"], :visited[target="_blank"], :link[target="_new"], :visited[target="_new"] {cursor: crosshair;}

Cambiar el cursor para links de JavaScript

Este tip cambiará el puntero del mouse cuando lo pase sobre links que ejecuten un comando JavaScript. Añada el siguiente código a su archivo userContent.css:

/* Cambiar puntero para links JavaScript */a[href^="javascript:"] {cursor: move;}

« Subir

Otros Trucos

Cambiar el lenguaje en páginas web

Algunos sitios web ofrecen contenido en múltiples lenguajes. Puede escoger varios lenguajes en Mozilla Firefox y serán tratados en orden de prioridad. Para cambiar la prioridad, debe saber el código de su lenguaje. El código para el español es es, el cual usado en este ejemplo debería ser ubicado en el archivo user.js:

// Cambiar lenguaje al español (defecto es "en, en-us")user_pref("intl.accept_languages", "es, en, en-us");

Seleccionar y copiar individualmente celdas de tablas

Mientras mantenga apretada la tecla Ctrl puede seleccionar celdas individuales en una tabla. Solo haga click en una porción de la celda donde no haya ningún link. Puede seleccionar múltiples cledas, ya sea haciendo click individualmente en cada una de ellas, o arrastrando con el mouse . Una vez seleccionadas, puede usar Copiar y Pegar como normalmente lo haría con texto.

Acelerar el renderizado de páginas

Por defecto, Mozilla Firefox no trata de renderizar una página por 250 milisegundos, porque se encuentra esperando por data. Si añade el código de abajo en su archivo user.js, Mozilla Firefox inmediatamente tratará de renderizar la página, aún cuando no tenga data completa. Lo malo es que en máquinas lentas puede haber un reflujo de información, causando que el tiempo total de cargado de la página termine siendo mas lento.

// Esto hace mucha diferencia. Ultimo valor en milisegundos (por defecto es 250)user_pref("nglayout.initialpaint.delay", 0);

Habilitar Pipelining

El Pipelining es una función experimental, diseñada para mejorar el rendimiento de cargado de páginas, que desafortunadamente no está muy bien soportado por ciertos servidores web y proxies. Para probarlo, añada el siguiente código a su archivo user.js:

// Habilitar pipelining:user_pref("network.http.pipelining", true);user_pref("network.http.proxy.pipelining", true);user_pref("network.http.pipelining.maxrequests", 100);

Especificar donde guardar el cache

Escribe en la barra de direcciones: about:cache

Para especificar en que carpeta es guardado el cache, añada el siguiente código a su archivo user.js:

// Path a la carpeta Cache:user_pref("browser.cache.disk.parent_directory","C:\\Path al Cache");

Recuerde usar dos backslashes para separar directorios si usa Windows, ej. C:\\Path\\Path al Cache en vez de C:\Path\Path al Cache.

Especificar el uso de la memoria cache

Normalmente, Mozilla Firefox determina el uso de memoria cache dinámicamente basado en la cantidad de memoria disponible. Para definir una cantidad específica de memoria cache, añada el siguiente código a su archivo user.js:

// Especificar la cantidad de memoria cache:// -1 = determinar dinámicamente (por defecto), 0 = nada, n = memoria en kilobytesuser_pref("browser.cache.memory.capacity", 4096);

Para deshabilitar la memoria cache completamente, añada el siguiente código:

// Deshabilitar memoria cache:user_pref("browser.cache.memory.enable", false);

Acceder a más preferencias

Muchas opciones en Mozilla Firefox aun no son (o nunca serán) implementadas en la ventana de Opciones. El siguiente link muestra la ventana de Preferencias original, derivada del código base de Mozilla: chrome://communicator/content/pref/pref.xul. Por defecto, haciendo click en links chrome: no hace nada, así que necesitará hacer click derecho en el link y seleccionar Copiar Ubicación del Link y luego pegarlo en la barra de direcciones y apretar Enter.

Nótese que muchas de las opciones en esta ventana no tendrán efecto en Mozilla Firefox, tales como la opción de Quick Launch. También, es probable que este link sea completamente eliminado en futuras versiones de Mozilla Firefox.

Navegador en modo Kiosk

Andrew Mutch a escrito un muy buen tutorial que explica como modificar Mozilla Firefox para correr en estilo kiosk. Lea todo sobre esto aqui.

Limitar Mozilla Firefox a una cantidad especifica de sitios web

Muchas librerias ahora proveen catalogos en linea, así como acceso a bases de datos en linea. A menudo, las librerias no quieren que estas computadoras tengan acceso a toda

la Internet. Este metodo le ayudará a limitar el acceso de Mozilla Firefox a una cantidad de sitios pre definidos.

« Subir

*- Documento original obtenido de MudBlood

Trucos Linux

Trucos Shell Linux

- Atajos del teclado- Reinstalé Windows y perdí Linux- Reseteando el terminal- Eliminar escritorios virtuales- Para que todos puedan usar kppp- Cómo evitar los pings- Eliminar ficheros Core- Personalizar tecla de función- Entrar al sistema sin saber la password - diskettera solo montarla los usuarios- Primer editor- Como descomprimir un .deb en una urgencia- Creando alias para el CD-ROM- Búsqueda Rápida de Archivos en Disco- Teclado en Español- Ficheros- Scroll del ratón en linux fácilmente- Limpiar la consola- Conexión a Internet- Ver los directorios en colores con bash- Obligar a reiniciar en caso de Kernel Panic- Opciones de Ventana- Nombres muy largos- ¿Dónde está?- Se colgó todo- Navegación con palabras clave- Descarga automática de webs- Montar cdrom y floppy sin ser root - Eliminar paquetes instalados en Debian - Configuración de LILO- Cómo formatear diskettes- Instalar las X con Dselect de Debian.

- Trucos para recompilar el kernel.- Caracteres en español en el shell- Economizando 800K de Ram- 2º Plano- Screen- teclas rápidas del bash- Evitar el ctrl-alt-supr- Arrancar Linux con NTLoader- Cambiar el logo de arranque 2.4- Grabación USB lenta- Pantalla de bienvenida- Inicio/Ejecutar- Olvidé la contraseña de root- Montaje disquetes VFAT- Eliminar el inicio gráfico- Comprimir y descomprimir en linux- Ampliar tamaño de partición Linux- Hacer disco de arranque Linux- News off-line con Netscape- linux ampliación de memoria - Acelerar la compilación del kernel.- Lanzar procesos con nohup- Cambiando el prompt del Bash- Páginas del Manual en castellano- Variables- Escribiendo el símbolo del € en KDE- Imágenes de CD rápidamente- Ver un documento de MS Word- Usuario por telnet- Cambiar el logo de arranque 2.6

 

 

Atajos del teclado

KDE brinda varias opciones para cuando se cansen del mouse. Presionando <CTRL+ ESC> cambiarán a otra aplicación. Con <ALT+TAB>, como era de esperar, rotarán entre todas las aplicaciones activas. Usando <CTRL+Fx> pueden cambiar de consola virtual y, por último, presionando <ALT+F4> se cierra la ventana actual, como sucede en Windows.

Opciones de Ventana

Haciendo doble clic en la barra de Título de un programa, la ventana desaparece, y queda sólo esta barra. Este efecto se llama shadowing y es algo que siempre me gustó de las Mac. Haciendo clic con el botón central del mouse en los botones para maximizar y minimizar las ventanas, se ejecutará la función, pero solamente a lo largo o a lo ancho de la pantalla, sin tomar posesión total del Escritorio. Ejecutar al inicio Para ejecutar un programa al inicio de KDE sólo tienen que crear un kdelnk hacia él (pueden encontrar templates de kdelnk en la carpeta TEMPLATES del Escritorio) y

editar sus propiedades. Lo único que resta hacer es arrastrar este kdelnk a la carpeta AUTOSTART dentro del Escritorio. Mensaje del día El mensaje del día (MOTD) no suele ser muy útil en sistemas hogareños, por lo que este script nos permitirá rotar entre diferentes archivos de arte ASCII cada vez que iniciemos el sistema. Creen e[ directorio /etc/splash y pongan todos los archivos ASCII allí. luego, como root, agreguen un trabajo cronometrado (cron) con el siguiente- script:

#! /bin/sh

cd /etc/splash/

[ -f splash &&SPLASH='/bin/cat splash'

[ -z "$SPLASH" ] ||

[ ! -f "$SPLASH" &&SPLASH='/bin/ls /bin/sed -n ´1p´'

/bín/cp "$SPLASH" ../motd && {/bin/ls /bin/sed -n

´1h;/^´$SPLASH,$/{${x;p;q;};n;p;}´ >. splash}

Pantalla de bienvenida

Es posible crear un mensaje para que todos los usuarios que se logueen al sistema lo vean. Es, en cierta forma, similar al mensaje que aparece cuando se conectan a un servidor de IRC. El archivo en cuestión se encuentra en /etc/motd (por Message Of The Day); edítenlo a gusto y necesidad con cualquier editor de texto.

Reinstalé Windows y perdí Linux

A Windows no te gusta que alguien más use la MBR; por eso, cuando instalamos cualquier versión, automáticamente sobrescribe la MBR a su gusto.Si teníamos Linux instalado con LILO, necesitaremos un disquete booteable para ingresar en Linux y poder ejecutar /sbin/lilo para que, nuevamente, LILO pueda instalarse en la MBR

Nombres muy largos

Una particularidad de Linux (como en todos los sistemas basados en UNIX) es que los archivos suelen tener nombres muy largos. Pasarlos como parámetros puede volverse complicado cuando no los recordamos de memoria. Por eso el shell Bash nos ofrece su función de autocompletado, mediante la cual, al escribir las primeras letras del nombre y presionar <TAB>, Bash mostrará las coincidencias; esto nos evitará el engorro de tipear el nombre completo del archivo.

Inicio/Ejecutar

Presionando <ALT+F2> verán la línea simple de comando, la cual les permitirá ingresar el nombre de un programa o una URL para navegar.

Reseteando el terminal

Cuando la pantalla, por cualquier motivo, se llena de basura, podemos utilizar este programa en C, el cual reseteará y limpiará cualquier terminal VT100. Copien este código en un archivo:

#include <stdio.h> int main(void){

Printf(P\033c");//resetea terminalprintf(P\033[2j");// limpia la pantallareturn (0);

luego graben el archivo y escriban "make archivo", siendo archivo el nombre con el que lo grabaron. Ahora pueden utilizarlo en cualquier momento para resetear su terminal

¿Dónde está?

En el inmenso mar de directorios de Linux, puede resultar complicado encontrar un archivo determinado. Para ello pueden utilizar el comando find, por ejemplo: find /-name "nombre", donde la "/" es el directorio de inicio de la búsqueda (en este caso buscará en todo el sistema de archivos, así como en cualquier unidad montada) y "nombre" es la cadena a buscar (reemplácenlo por el nombre del archivo que buscan). Como todo comando en Linux, tiene un montón de opciones más.

Olvidé la contraseña de root

Pueden pasarte un parámetro 1 cuando se ejecute LILO, de la siguiente forma: "lilo 1". Así entrarán como root y podrán ejecutar el comando passwd o editar directamente el archivo /etc/passwd. También sirve arrancar con linux single y añadirte el user root o el que sea manualmente :)

Eliminar escritorios virtuales

Puede parecer una idea rara, pero eliminar escritorios virtuales que no utilicemos liberará recursos. Editen el archivo /etc/inittab y busquen las líneas que indican el inicio de una terminal "getty", por ejemplo: "2:123:respawn:/sbin/míngetty tty2". Eliminen cada una de esas líneas por escritorio que quieran quitar; el número posterior a tty indica el número de terminal (a los cuales accedemos presionando <ALT+Fx>). Un número de tres terminales es suficiente para operar el sistema. Graben el archivo y reinicien. Ya no tendrán tantos terminales, y habrán ganado unos megabytes de memoria.

Se colgó todo

Cuando experimentamos en Linux, precisamente en el entorno gráfico, a veces sucede que todo se cuelga. Para no ir directamente al botón de reset, pueden probar la combinación de teclas <CTRL+ ALT+BACKSPACE>, que matará todos los procesos que se encuentren en ejecución y pasará a modo texto o al login gráfico si lo tienen activado.

 

Montaje automático de disquetes VFAT

Abran una consola (la de su preferencia) y ejecuten el comando mcedit Desktop/floppy.kdelnk, que abrirá un editor de texto con el archivo de acceso al disquete del Escritorio. En éste debemos modificar el valor contenido dentro de la línea FStype=Default por FSType=v-fat.

 

Para que todos puedan usar kppp

Deben hacer clic con el botón derecho en el archivo situado en /usr/bin/kppp, y en la solapa [Permissions], hacer clic en el checkbox [Set UID], en la línea [User]. Esto hará que todos los usuarios puedan iniciar Kppp y no sólo el root. Recuerden que para realizar los cambios deben estar logueados como root.

Navegación con palabras clave

Konqueror, el oficial de KDE, nos permite definir palabras nos serviran como atajos para los sitios más visitados, desde [Settings/Configure Konqueror/Enhaned Browsing]. Por ejemplo, al escribir "gg:linux" en barra de Dirección, se abrirá el buscador Google con palabra Linux.

Eliminar el inicio gráfico

si desean el inicio en modo consola, pero su distribución instala el inicio gráfico de forma predeterminada, pueden cambiarlo modificando el archivo inittab, dentro del directorio /ETC. Hagan una copia de respaldo y editen el archivo inittab. Con la búsqueda encuentren la línea: id:5:initdefaultY cámbienla por lo siguiente: id:3:initdefault:En el próximo inicio de sesión tendrán el clásico modo texto. Para restaurar el inicio gráfico, hagan exactamente lo contrario. Cómo cambiar la resolución y la profundidad de color en X Estos parámetros son controlados por el Servidor X, independientemente del manejador de ventanas que utilicemos. Si en la configuración de X hemos agregado varias resoluciones, podremos cambiar de resolución con las teclas <CTRL++>. La profundidad de color, en cambio, se modifica a través del script de inicialización startx, de la siguiente manera: "startx -bpp <profundidad>", donde profundidad puede tomar los valores 8, 16, 24 o 32 para las distintas opciones. Es posible cambiarlo permanentemente desde el configurador XF86Setup.

 

Cómo evitar los pings

Si quieren evitar que su equipo responda a las peticiones ping de la Red, pueden usar este truco. Es necesario contar con un kernel 2.1.x o superior. Para lograrlo, en la consola deben ejecutar el siguiente comando: "echo 1 >/proc/sys/net/ipv4/icmp_echo_ignore_all"'. Con él evitarán que su máquina responda a cualquier ping proveniente de la Red. Para revertir la opción, en la consola ejecuten el comando

"echo 0 > /proc/sys/ net/ipv4/icmp_echo_ignore_all", y todo volverá a ser como antes.

 

Descarga automática de webs completas

Para descargar una web completa con todas las páginas a las que apunta y todos sus elementos de forma recursiva, puede usar la aplicación wget tecleando el siguiente comando:

wget -r http://www.lawebquesea.com

Y si lo que tiene es un fichero de texto con un listado de webs puede descargarlas todas del tirón tecleando:

wget -r -i listadewebs.txt

Eso sí, si no tiene una conexión muy buena tendrá que esperar un rato hasta bajar toda la web.

NOTA: Algunas páginas están expresamente protegidas para que no sean bajadas por este método, por lo que esto no funcionará en todos los casos. Tampoco funciona con páginas creadas con Flash

Comprimir y descomprimir en linux

Supongamos que tenemos un directorio llamado subcarpeta que cuelga de carpeta, si queremos comprimir su contenido en un fichero tar.gz o descomprimir un fichero tar.gz en el directorio carpeta para que se genere toda su estructura de directorios, estos serían los comandos:

Comprimir:cd carpetatar -c subcarpeta >fichero.targzip fichero.tar

Descomprimir:cd carpetagunzip fichero.tar.gztar -xvf fichero.tar

Si quieres usar los nuevos ficheros bz2 los comandos son los mismos sustituyendo gzip con bzip2 y gunzip con bunzip2.

Los ficheros tar, gz y tar.gz se pueden ver también desde MS-DOS o Windows con algunos compresores como el Windows Commander.

 

Eliminar ficheros Core

ln -s /dev/null core (envía los core a /dev/null)

ulimit -c 0 (limita el tamaño de los core a 0)

11.2 Imprimir paquetes instalados con dselect

método 1 - dpkg --get-selections | awk '$2 == "install" { print $1 }'

método 2 - ( cd /var/lib/dpkg/info; ls *.list ) | sed -e "/\.list/s///"

método 3 - dpkg -l

Montar cdrom y floppy sin ser root

Como root te creas los directorios/mnt/floppy /mnt/a: /mnt/cdrom

metes en /etc/fstab las siguientes lineas :

/dev/cdrom /mnt/cdrom iso9660 ro,user,noauto 0 0 /dev/fd0 /mnt/a: msdos user,noauto 0 0 /dev/fd0 /mnt/floppy ext2 user,noauto 0 0

ahora ya puedes montar un disquete Ms-dos , un disquete ext2 o un Cd-rom, respectivamente, con : mount /mnt/a: mount/mnt/floppy mount/mnt/cdrom

El nombre del dispositivo puede ser distinto, por ejemplo, en vez de /dev/cdrom puedes tener /dev/hdc ... etc., depende de cada cual.

Ampliar tamaño de partición Linux

Bueno, ampliar no creo que se pueda, pero si te creas otra partición ext2, la montas debajo de / , como por ejemplo /home, luego te creas un directorio /home/usr/local y lo enlazas a /usr/local, etc... tendrás la sensación de que efectivamente tu partición / ha aumentado de tamaño :-).

O mejor todavía :

te creas una nueva partición, por ejemplo: /hdc3 te copias todos los directorios de /usr a /mnt/hdc3 te renombras el fichero /usr como /usr_ant por si las moscas te creas el fichero /usr vacío actualizas el /etc/fstab con la siguiente línea : /dev/hdc3 /usr ext2 defaults 0 0 rearrancas, y después de unos días, para ver que todo funciona bien, borras /usr_ant

 

Personalizar tecla de función

Utilizo un pequeño script que tengo asociado a una tecla de función en mi .inputrc, así, cada vez que quiero meter o sacar un CD, le doy a la tecla F8.

## FICHERO: $HOME/.inputrc

# Personalizar teclas de función # F8

"\e[19~": "(. ~/scripts/cdrom)&\C-m"

Y el script es:

#!/bin/bash

if [ `grep -c cdrom /etc/mtab` = 0 ] ; then mount /mnt/cdrom && cd /mnt/cdrom ; else umount /mnt/cdrom && eject /dev/cdrom ; fi

Eliminar paquetes instalados en Debian

dpkg --remove nombre_paquete_sin_extension_deb

eliminara el paquete aunque no los ficheros de configuración que ese paquete pudiera tener.

dpkg --purge nombre_paquete_sin_extension_deb

eliminara todo.

 

Hacer disco de arranque Linux

cp /boot/vmlinuz /dev/fd0

así de simple, siempre y cuando el kernel contenga la información sobre cual partición arrancar, etc. lo que se puede indicar así:

rdev /boot/vmlinuz /dev/tuparticionroot

rdev /boot/vmlinuz indicará cual tiene configurada:

chanae:~# rdev /boot/vmlinuz Root device /dev/hda3

 

Entrar al sistema sin saber la password

Cuando aparece el prompt de Lilo o el del disco de arranque escribir 'linux single' y entras como root sin necesidad de password después hay que entrar con un editor en /etc/passwd, buscar una línea que pone root:xxxx:0:0:root:/root:/bin/bash,

borrar xxxxx dejando root::0:0, etc así has borrado la pasword.

Otra opción: desde DOS, utilizar un editor del disco duro (Norton) buscar la cadena root en el HD y eliminar la password.

Otra opción: en el arranque, escribir init=/bin/bash, esto hace que se lance bash directamente sin pasar por el init, o sea, sin pedir clave. probablemente hay que remontar las particiones: mount -t -o remount, rw / mount -a -t nonfs para estar seguro de que el PATH esta correcto hacer: source /etc/profile source /root/.profile y por ultimo, a partir de una cuenta no-root, hacer su; para ver si la clave de root esta ok: paswwd su < usuario-no-root >su exit exit reboot

Configuración de LILO

Fichero /etc/lilo.conf :

# Sección global de arranque de LILO boot = /dev/hda compact # si da problemas, descomentar esta opción delay = 50 vga = normal # forzando 'sane-state' ramdisk = 0 # paranoia setting # # Sección de configuración de partición de LINUX arrancable image = /vmlinuz root = /dev/hdc2 label = linux # # Sección de configuración de partición de DOS arrancable other = /dev/hda1 label = dos table = /dev/hda #fin

Sustituye las particiones por las tuyas, la primera que pongas será la que arranque por defecto pasado el tiempo 'delay' en décimas de segundo. Una vez hayas modificado este archivo, ejecuta lo siguiente:

root::/# lilo

Veras como te aparecen por pantalla las particiones que hayas configurado para gestionar por lilo y la que hayas colocado como 'defecto' aparece con un asterisco.. Otra versión del /etc/lilo.conf

boot=/dev/hda # donde se instalará el LILO compact install=/boot/boot.b map=/boot/map vga=normal # pantalla en modo VGA ramdisk=0 # no creamos disco virtual, necesario para crear los # discos boot y root de la instalación delay=50 # espera 10 segundos. [Ctrl] nos muestra las opciones # que seleccionaremos escribiéndola default=linux-2.0.32 # establece el SO que arrancará por defecto

image=/vmlinuz # la imagen del kernel a arrancar label=linux-2.0.30 # el nombre asociado root=/dev/hdb1 # partición donde está la correspondiente imagen alias=l # para abreviar en la selección read-only

image=/boot/zImage-2.0.32 label=linux-2.0.32 root=/dev/hdb1 alias=z read-only

other=/dev/hda1 table=/dev/hda # para que msdos encuentre la tabla de particiones label=msdos alias=m ----

Cuando has editado tu lilo.conf, para instalarlo tienes que ejecutar, como root,

# lilo

y se instalará en el Master Boor Record de hda (en mi caso). Debe ser una partición a la que tenga acceso la Bios del ordenador..

En Netscape los ficheros .gz y .tgz en lugar de bajártelos te los muestra

Edit - Preferences - Navigator - Applications.

Buscamos en la lista "Zip compressed data", pulsamos el botón "Edit", en Suffix añadimos ",gz,tgz" y abajo seleccionamos "Save to disk". Ok, Ok y listos :-). (Hue-Bond) De esta forma cuando pinches uno de estos ficheros te preguntará si quieres guardarlo, en lugar de intentar ejecutarlo.

News off-line con Netscape

El Netscape no hay ninguna opción para bajarse las news, pero con el siguiente truco se puede conseguir el mismo efecto:

Lo primero es crearse dos nuevos directorios en el Message Center con "New Folder" (yo los llamo Linux y Linux_Archive). Abres el grupo es.comp.os.linux y le dices que te baje todos los mensajes. Después

en menú "View" marcas "Messages" y "News". Eso expande todos los Treads. Ahora los marcamos para bajarlos. Lo podemos hacer con menú "Edit", "Select", "All" (o más rápido Alt+A). Y los bajamos con "File" al directorio que hemos creado. Sin cerrar la conexión debemos marcarlos todos como leídos. Para ello "Mark" y "All Read". Y ahora podemos cerrar la conexión. Para leerlos vamos a nuestro nuevo directorio Linux y los podemos ordenar cómo queramos... "View", "Sort"... yo lo tengo en "By Subject". Los que me interesan los archivo en el otro directorio que creé ("Linux_Archive") y los que no a la papelera ("Delete"). Como seleccionamos la opción "View", "New", la próxima vez que entremos en el grupo sólo nos bajará los nuevos mensajes.

 

Hacer que la diskettera solo puedan montarla los usuarios de un determinado grupo

$ ls -l /dev/fd0 brw-rw---- 1 root floppy 2, 0 ago 24 1997 /dev/fd0

$ grep floppy /etc/group floppy::11:root,srtxg,fab

$ grep nobody /etc/passwd nobody:*:99:99:nobody:/dev/null:

$ grep /dev/fd0 /etc/fstab /dev/fd0 /mnt/floppy vfat user,noauto,uid=99,gid=11,umask=007

explicaciones:

* los permisos sobre el device (hacerlo para todos los /dev/fd0*) evitan que se pueda acceder usando los mtools si no se es miembro del grupo floppy. * en fstab se declara las opciones "user" (para que pueda ser montado por gento no-root), "noauto" (para que no sea montado al arranque), el uid y gid de los archivos y directorios vfat (yo elegí nobody y group floppy), y por fin la máscara (007 significa permisos 770; o sea rwxrwx---).

Si además quieres impedir no solo el acceso a los datos, sino también el uso de mount; cambia los permisos de mount y umount; algo así:

chown root.mount /bin/*mount chmod o-rwx /bin/*mount chmod u+s /bin/*mount

y añade al grupo mount todos los usuarios que quieras que puedan usar mount. para montar el floppy (u otras cosas; todo lo que tenga "user" en las opciones en /etc/fstab)

Pablo Saratxaga

Cómo formatear diskettes

formato tipo msdos: mformat a: formato tipo ext2: fdformat /dev/fd0H1440 mkfs.ext2 /dev/fd0

Para Linux --> ext2

$ mkfs.ext2 [options] /dev/fd0

ó

$ mke2fs [options] /dev/fd0

El usuario que formatea deberá tener permiso de escritura para `/dev/fd0'. Eso normalmente se consigue añadiéndolo al grupo `floppy' (addgroup user group).

Para msdos

$ mkfs.msdos [options] /dev/fd0

ó

$ mkdosfs [options] /dev/fd0

Pero también hay otras utilidades para formatear discos DOS. Mira a ver si tienes el paquete `fdutils', que permite formatear los discos a mayor capacidad.

Cómo hacer que linux reconozca ampliación de memoria

> He añadido 64 megas nuevos al aparato con lo que sumo 80 megas > el problema es que linux solo me reconoce 64 ¿como hago para que > reconozca los 80?

pon append="mem=80M" en lilo.confo loadlin vmlinuz mem=80M

Primer editor

Una de las primeras dificultades con las que se topan los novatos es cómo ver y editar ficheros.

El "less" está más o menos bien aunque es un poco "soso". El "vi" puede ser un auténtico trauma.

Para los que acaban de llegar a linux puede que les sea interesante este "truco":

1) Instalar el Midnight Commander. 2) Añadir en el ~/.bashrc estás líneas: alias lee='mc -v ' #ojo, que hay un espacio detrás de la v. alias edit='mcedit' 3) teclear "exit" e iniciar una nueva sesión.

A partir de entonces se puede ver el contenido de un fichero con "lee fichero" (además lee fichero comprimidos) y editarlo con "edit fichero". La tecla F10 es para salir, y la tecla F9 para abrir el menú.

Bueno, esto es lo que he hecho yo, y me gusta más que less y vim, pero hay una pega, y es que no puedo pegar en el mcedit con el ratón lo que previamente he copiado en otro terminal.

(ricardovm) Pues lo acabo de probar:

Mayúsculas + Botón Izquierdo: inicio de la selección Mayúsculas + Botón Derecho: fin de la selección Mayúsculas + Botón Central: pegar

NOTA: el bloque así seleccionado se maneja de forma estándar: si desde otra consola pulsamos el botón central del ratón, lo pegamos, etc. Además el mc tiene su propia herramienta de selección de bloques (F3, o May+Flechas), y con esto se puede copiar (Ctrl+Ins), cortar (May+Del) y pegar (May+Ins) incluso de una sesión a otra, pues lo copiado (cortado) se guarda en /.cedit/cooledit.clip.

Ambas herramientas se pueden usar simultánea e independientemente.

([email protected])

 

Instalar las X con Dselect de Debian.

Sesión de dselect. Como root pon dselect.

Dentro del menú ve a "[S]elect", te sale un mensajito de bienvenida y tal, pulsas la barra y ahora toca seleccionar paquetes.

Pulsa la "o" minúscula 2 veces y la mayúscula otras dos, con esto consigues que la lista de paquetes salga ordenada alfabéticamente.

Entonces ahora avanza páginas y páginas hasta encontrar el paquete "xbase" (creo).

Una vez ahí lo seleccionas pulsando la tecla "Ins" (si no lo tienes seleccionado ya, en cuyo caso esta parrafada te la saltas ;-)).

Probablemente dselect ahora te saque un mensaje diciendo "Che!! Y las dependencias qué?", pulsas la barra y ves abajo que pone

"xbase requires xserver-vga16" (por ejemplo), entonces vas al xserver-vga16, que te aparece por ahí y lo "Ins"ertas, aunque verás que dselect ya lo ha seleccionado él solito.

Para salir y volver a la lista de todos los paquetes pulsa Enter.

Ahora un poco más abajo te aparecen los servidores, añade el xserver-svga y el xserver-s3v (el de la ViRGE). Si te pregunta por dependencias pues eso, aunque dselect ya lo suele añadir todo.

Instala también algún gestor de ventanas adicional (por defecto se instalan el twm y el fvwm creo),a mí me encanta el icewm.

Para salir de la lista de paquetes, es con Enter de nuevo y vuelves al menú principal.

Selecciona "[I]nstall" y ve a tomar un cafecito rápido de 5 minutos.

Cuando acabe pulsas Enter, te aparece de nuevo el menú y te vas a Quit o Exit o lo que sea.

Ya tienes las X instaladas.

Ahora toca sesión de XF86Setup.

Configuras el mouse, el teclado (Model: Generic 102 keys Intl PC, Layout: Spanish), la tarjeta de vídeo (tienes 5 ViRGEs, ya sabes, a experimentar), en esa misma pantalla pulsas el botoncito que pone "Detailed setup", seleccionas el servidor S3V (la fila de botones de arriba), luego el monitor (mírate el manual para saber las frecuencias, yo le puse el 4º, el que empieza por Super VGA y me va bien), por último los modos de vídeo y listo, pulsa "Done" abajo (en la sección Other no hace falta tocar nada, aunque nadie te prohibe echar un vistacito.).

Tras eso te aparece un dialoguillo, pulsas "Okay" y ahora se arrancará el servidor.

Si rula, felicidades; si no... a por otra ViRGE. ¿Que ya has probado las 5? Pues en "Detailed setup" prueba el servidor SVGA.

¿Que tampoco rula? Pueeeees entonces ya pasa de castaño... no? (Hue Bond)

 

Acelerar la compilación del kernel.

He encontrado un truco que puede acelerar tremendamente el compilado del kernel de linux.

Cuando se da la orden de compilar en vez de :

make zdisk

hay que escribir

make -j5 zdisk

Esto inicia hasta 5 procesos de compilado simultaneos.

Idem con

make -j5 modules

 

Como descomprimir un .deb en una urgencia

Como desempaquetar un .deb en una urgencia.

Suelo trabajar con varios sistemas Linux, distribuciones Slackwareen la facultad, Debian en el trabajo y Red Hat en casa. Al tener tantoRedHat como Debian, tengo una cantidad de soft en formato rpm como .deb,y en algun momento me he visto en la necesidad de instalar un .deb en laREDHAT en casa, o un rpm en Debian o Slackware. Para estas cosas, lo mejores alien, un programa conversor de paquetes, pero solo viene por defecto enla Debian. Asi que me vi en la dificultad de instalar un .deb en la RedHatde mi casa. Asi que con la utilidad file, vi que era un archivo ar:

bash# file mctools-lite_970129-1.debmctools-lite_970129-1.deb: current ar archive Debian binary packagebash#

En el paquete binutils, se incluye el programa ar, que se utilizapara archivar ficheros en un solo archivo, algo asi como el tar, solo queeste ultimo esta especializado para streamers y esas cosas.... Con unarapida miradita al man, averiguo que la opcion para descomprinir ar's es x,de forma que tecleo:

bash# ar x ../mctools-lite_970129-1.debbash# ls -latotal 159drwxr-xr-x 2 root root 1024 Jul 21 01:45 .drwxr-xr-x 5 root root 1024 Jul 21 01:42 ..-rw-r--r-- 1 root root 1276 Jul 21 01:45 control.tar.gz-rw-r--r-- 1 root root 156567 Jul 21 01:45 data.tar.gz-rw-r--r-- 1 root root 4 Jul 21 01:45 debian-binarybash#

Si descomprimimos el archivo control.tar.gz, encontramos lossiguientes ficheros:

bash# tar zxvf ../control.tar.gzbash# ls -latotal 7drwxr-xr-x 2 root root 1024 Feb 13 1997 .drwxr-xr-x 3 root root 1024 Jul 21 01:48 ..-rw-r--r-- 1 root root 1299 Feb 13 1997 checksums-rw-r--r-- 1 root root 437 Feb 13 1997 control-rwxr-xr-x 1 root root 264 Feb 13 1997 postinst-rwxr-xr-x 1 root root 70 Feb 13 1997 postrmbash#

En el fichero control, se encuentra la informacion que nos sueleofrecer el dselect cuando le pedimos informacion sobre un paquete. Los demasficheros tienen informacion sobre que hacer con el sistema antes y despuesde la instalacion. Para mas informacion, en las distribuciones debianexisten HOWTO's con todos los detalles sobre los paquetes debian.

En el archivo data.tar.gz, esta la aplicacion en si, que si se

descomprime a partir del fichero raiz colocara a todos los ficheros en susdirectorios correspondientes.

Este metodo se debe usar como ultimo recurso, ya que los programasinstalados asi no podran ser desinstalados o actualizados con rpm ni condpkg, pero por lo menos, nos puede servir para salir de un apuro en unmomento dado :)

Un Chaludo.

ErConde/IdeaFix | CoSysop de Kronos BBS | SpClub de la FIE | [email protected] | [email protected] | [email protected]

Trucos para recompilar el kernel.

Casi todos no hemos topado con la consabida configuracion del nucleo de Linux, seguida de su compilacion, instalacion, etc...

make config (menuconfig, xconfig)

make dep

make clean

make zImage

cp arch/i386/boot/zImage /boot/vmlinuz

cp System.map /boot

make modules

make modules_install

Bueno pues los pasos zImage y cp's los podemos olvidar editando el fichero Makefile que hay en /usr/src/linux, buscar :

#INSTALL_PATH=/boot

Descomentar la linea (¡ quitar la #, corcho !)

Para los que tienen su Linux mas personalizado que la Harley, podeis poner el directorio donde queries poner el nuevo kernel, ese directorio debe corresponderse al que pone en el /etc/lilo.conf.

Una vez hecho esto, se puede reemplazar el make zImage y cp's por make zlilo.

Datos del autor/a:

Nombre: Manuel Soriano.

 

Lanzar procesos con nohup

Para lanzar un proceso y luego poder matar el shell padre, solo debemos hacerlos de la siguiente manera:

nohup proceso &

por ejemplo si queremos lanzar licq con el parámetro -p \qt-gui la linea correspondiente seria la siguiente:

nohup licq -p \qt-gui &

 

Creando alias para montar y desmontar el CD-ROM

Para ahorrarnos tiempo al momento de montar y desmontar el CD podemos aprovechar una de las propiedades del shell bash, esto es definir alias, para ello solo tenemos que agregar en el archivo .bashrc que se encuentra en nuestro directorio home las lineas:

alias cdr='mount -t iso9660 /dev/cdrom /mnt/cdrom -r' alias ucdr='umount /cdrom'

Donde, /dev/cdrom especifica el dispositivo correspondiente a nuestro CD-ROM, y /mnt/cdrom debe ser un directorio vacío.

 

Caracteres en español en el shell

Para poder visualizar todo el set de caracteres españoles en Linux solo debemos agregar la siguiente línea a uno de los archivos de inicialización del sistema, por ejemplo /etc/profile, en algunas distribuciones esta línea ya esta incluída y solo debemos modificarla:

/usr/bin/setfont /usr/lib/kbd/consolefonts/lat1u-16.psf

Según las distribución que usemos los archivos con los sets de caracteres se ubican en distintos lugares, por ejemplo en Debian están en /usr/share/consolefonts/

 

Cambiando el prompt del Bash

Agregando en el archivo .bashrc de nuestro directorio home (/root si nos logeamos como usuario "root") la siguiente función dispondremos de un prompt mas atractivo que el común:

function promptmio { PS1="\[\033[31m\]\332\304\[\033[34m\](\[\033[31m\]\u\[\033[34m\]@\[\033[31m\]\h\ \[\033[34m\])\[\033[31m\]-\[\033[34m\](\[\033[31m\]\$(date +%I:%M%P)\ \[\033[34m\]-:-\[\033[31m\]\$(date +%m)\[\033[34m\033[31m\]/\$(date +%d)\ \[\033[34m\])\[\033[31m\]\304-\[\033[34m]\\371\[\033[31m\]-\371\371\ \[\033[34m\]\372\n\[\033[31m\]\300\304\[\033[34m\](\[\033[31m\]\W\[\033[34m\])\ \[\033[31m\]\304\371\[\033[34m\]\372\[\033[00m\]"PS2="> " }

Luego solo tenemos que salir de la sesión en curso y volver a entrar para finalmente llamar a la función mediante: promptmio

 

Búsqueda Rápida de Archivos en Disco

En Linux contamos con una utilidad muy poco conocida , llanmada locate que nos permite consultar en una base de datos con los nombres y las ubicaciones de todos los archivos de nuestro sistema ,esta base de datos se actualiza desde el Cron y su uso es tan sencillo como poner por ejemplo ,locate Profile ,lo que nos dara la ubicacion exacta de este archivo .

 

Economizando 800K de Ram de X-Window

Una buena forma de ahorrar aproximadamente 800K de Ram al arrancar X-Window es hacerlo de la siguiente manera : Exec startx Con esto lanzaremos Starx matando el proceso padre ,es decir el Shell.

 

Páginas del Manual en castellano

Para poder tener el manual en español seguimos estos pasos :Bajamos el archivo con la ultima version de las Man.Descomprimimos el archivo en un directorio desde donde se realizara la instalacion con : tar xvfz man-pages-es0.7a.tar.gzingresamos en el directorio que se creo y ponemos make install. Editamos el directorio /etc/profile para especificar que de prioridad al lenguaje español agregando export LANG=es_ES .

Salimos de Shell y volvemos a entrar y ya tendremos las paginas del manual en español.

 

Teclado en Español

Para configurar nuestro teclado español para utilizarlo bajo Linux ,debemos usar un programa llamado Loadkeys ,mediante el cual podremos cargar el mapa de teclado :es.map.gz que se encuentra en el directorio /usr/share/keymaps/i386/qwerty. La siguiente linea es la que deberiamos incluir en uno de los guiones de nuestro sistema:loadkeys/usr/share/keymaps/i386/qwerty/es.map.gz

 

2º Plano

& manda a 2º planojobs muestra trabajos en 2º planokill %numero mata [...]

kill numero mata PIDctrl+c matactrl+d terminactrl+z pausafg %numero relanza tarea a 1ºplanobg %numero relanza tarea a 2ºplano

Variables

entorno entorno del sistemaincorporadas proporcionadas por el sistema, no modificablesusuario modificables en la shell

$echo $PATH rutas de comandos ejecutables

$a=playa variable local $echo $a visualiza variable local

export muestra variables exportadasexport a variable a global

Ficheros

r lecturaw escriturax ejecución

-r--r--rw- 1 usuario grupo 505 mar...

-{-(fichero) d(directorio)}r--{propietario}r--{grupo}rw-{usuario}

chmod {a(all),u(user),g(group),o(other)}{+,-}{r,w,x} fichero modo absoluto

r 4w 2x 1

chmod 644 fichero modo octal

ln crea enlacesls -i número inodo

$ls -i dietas22192 dietas

$ln dietas restaurantes enlaces duros en mismo sistema de ficheros$ls -i22192 dietas22192 restaurantes

-rw-r--r-- 2{número enlaces al fichero}

ln -s fichero1 fichero2 enlace simbólico, no influye los permisos del enlace fichero2->fichero1

 

Screen

Esta aplicación que sabrán apreciar todos aquellos que gusten de usar la consola: Cambia entre diferentes programas desde un solo terminal en vez de estar con varios terminales para poder usar múltiples programas a la vez en consola.

screen arrancamos la aplicación, y ahora:C^a c crea una nueva 'ventana'C^n ó C^p cambias entre las 'ventanas'C^a Esc permite mover el cursor por el terminalexit cierras todas las sesiones ('ventanas') y la aplicación screen se cierra

Bueno vale, no esta mal, buff, pim, pam... pues NO!! aún queda lo mejor: Si cierras la aplicación screen, cerrando la conexión en ssh, dando a la X en tu gestor de ventanas o ... no pasa nada, todas las aplicaciones que tenías abiertas siguen estándolo y puedes volver a usarlas.screen -list ejecutado en una sesión normal de consola, nos devuelve las screen que se están ejecutandorubenr@petalo:~$ screen -listThere is a screen on:840.pts-0.petalo (Attached)1 Socket in /var/run/screen/S-rubenr.screen -Dr 840 para recuperar esta screen, debes cambiar el 840 por la correcta en tu caso

Si por alguna razón se traba y no acepta ninguna tecla, será porque has pulsado una combinación errónea, C^q ó C^s lo solucionan. Recomiendo man screen para sacar más provecho a esta fantástica aplicación.

 

Escribiendo el símbolo del euro en KDE

Lo único que debemos cambiar, o al menos cambiándolo yo he conseguido escribir el símbolo del euro, es el /etc/environment. Según Ricardo debería ser:

LC_ALL=es_ES@euroLANG=es_ES.ISO-8859-15LANGUAGE=en_USLC_TYPE=es_ES@euro

Buscando por google, encontré una lista de correo en la que también se discutía sobre el tema y decían que para que funcionara las líneas de LANG y LC_ALL debían ser exactamente:

LC_ALL=es_ES@[email protected]

Podemos ver que el valor de LANG difiere ligeramente del indicado en el artículo de Ricardo.

La verdad es que cambiando estas líneas y siguiendo el artículo de Ricardo, a mi me ha funcionado (una vez reiniciado el servidor X, por si las moscas ;-)

Si quieres que los mensajes del sistema (y las páginas del man) te aparezcan en inglés, añade la línea LANGUAGE=en_US en el fichero /etc/environment

 

Scroll del ratón en linux fácilmente

En Xfree versión 4 edita este fichero /etc/X11/XF86Config-4y añade o cambia en la sección"InputDevice" Mouse0 estas lineas:

Option "Protocol" "IMPS/2"Option "Buttons" "5"Option "ZAxisMapping" "4 5"

Ahora graba sal y reinicia las X

La ruedecita ya deberia funcionar.

 

Recopilación de teclas rápidas del bash

Empezaremos con las que pudimos sacar de nuestros conocimientos:

* ^d (ctrl-d): Envía un EOF (final de fichero) a la shell que causa un logout.* ^c (ctrl-c): Termina el proceso que esté en ejecución.* ^z (ctrl-z): Pone el proceso en ejecución en sleep, pudiendo volver a el con, por ejemplo, fg.* ^l (ctrl-l): Realiza un clear (borrado de la pantalla) pero manteniendo la linea en la que fue pulsada esta combinación de teclas.* ^t (ctrl-t): Intercambia dos letras contiguas. Por ejemplo, supongamos que escribes apt-gte, pues te colocas en la 'e', le das a ^t y problema disléxico (más común de lo que pudiera parecer ;-) solucionado.* ^r (ctrl-r): El bash entra en el modo 'reverse-i-search', que se utiliza para buscar comandos que fueron ejecutados anteriormente. En este modo el usuario puede ir escribiendo parte de la linea de comandos que esta buscando, y el bash va mostrando la línea de comandos que el cree la más adecuada. Una vez has encontrado la que buscabas, enter.* ^s (ctrl-s): Bloquea la shell.* ^q (ctrl-q): Desbloquea la shell.

Pero aquí no acaba la cosa, ahora unos cuantos que he encontrado probando y/o buscando por el google:

* ^a (ctrl-a): Desplaza el cursor al inicio de la línea de comandos.* ^e (ctrl-e): Desplaza el cursor al final de la línea de comandos.* ^u (ctrl-u): Corta la linea de comandos desde la posición del cursor hasta el inicio de la línea. El texto cortado se guarda en una especie de "portapapeles", pudiendo realizar un paste (ver más abajo)* ^k (ctrl-a): Igual que ^u pero desde el cursor hasta el final de la línea.* ^y (ctrl-y): Pega el texto que previamente había sido cortado con ^u o ^.* ^b (ctrl-b): Desplaza el cursor una posición hacia la izquierda, como si usaramos la flecha hacia la izquierda de los cursores.* ^f (ctrl-f): Desplaza el cursor una posición hacia la derecha, como si usaramos la flecha hacia la derecha de los cursores.

* ^p (ctrl-p): Se desplaza por el histórico de la línea de comandos hacia atrás, como si utilizaramos la flecha hacia arriba de los cursores.* ^n (ctrl-n): Se desplaza por el histórico de la línea de comandos hacia delante, como si utilizaramos la flecha hacia abajo de los cursores.

Hay otras teclas rápidas que han sido aportadas por los comentarios a este artículo:

* ^w (ctrl-w): Corta desde la posición actual del cursor hasta el primer espacio que encuentra hacia la isquierda.

Finalmente he encontrado una combinación de teclas que me ha funcionado desde el las X (provado en konsole y xterm), pero que no me ha funcionado en la consola: ^_ (ctrl-_) que lo que hace es un undo o deshacer.

Insto a que si alguien encuentra alguna combinación de teclas más nos lo haga saber.

 

Haciendo Imágenes de CD rápidamente

Muchas veces usamos programas gráficos para grabar CDs que no son más que frontends para los programas cdrecord, mkisofs, cdrdao, etc. Para hacer una imagen podemos usar simplemente cat o dd:

dd if=/dev/cdrom of=imagen.iso

Gracias a kyle por esta:cat /dev/cdrom > imagen.iso

Ambos comandos hacen lo mismo, después, tostamos con cdrecord o con lo que queramos:

cdrecord -v speed=VELOCIDAD dev=GRABADORA imagen.iso

Si alguien ha probado a hacer dd if=imagen.iso of=/dev/GRABADORA y le ha funcionado, que me lo comunique por favor ;-)

 

Limpiar la consola

Si somos un poco vagos y no nos apetece hacer clear, no tenemos más que presionar la combinación de teclas Ctrl+L.

 

Evitar el ctrl-alt-supr

Si queremos evitar que los usuarios puedan usar esta combinación de teclas nos vamos a /etc/inittab y ponemos una almohadilla # de comentario en la siguiente linea:

ca::ctrlaltdel:/sbin/shutdown -t3 -r now

Pero si lo que queremos es que sólo determinados usuarios puedan usarlo, modificamos esa línea y la ponemos así (sin la # de antes):

ca::ctrlaltdel:/sbin/shutdown -a -t3 -r now

y creamos un archivo nuevo /etc/shutdown.allow con los nombres de usuarios que nos interese:

phantomusuarioinvitado

Está claro que si cambiamos ese -r por un -h nos apagaría el equipo, y bueno, para más opciones: man shutdown. Aun así, podríamos incluso poner otro comando, como que nos muestre un mensajito en consola y mil chorradas como esa, o no tan chorradas... a preferencia de cada uno.

 

Ver un documento de Microsoft Word en modo texto

Pues si no nos apetece entrar a las X para ver un documento de estos o simplemente no queremos/podemos cargar el openoffice, abiword y similares, nos bajamos el programita antiword que nos muestra por pantalla el texto del documento word.Este programa tambien permite salida en formato postscript, veamos un ejemplo:

Para ver el contenido en modo texto:

antiword cosa.doc | less

Convertimos a postscript con tamaño de página A4 y lo visualizamos con gv:

antiword -p a4 cosa.doc > cosa.ps ; gv cosa.ps

Para los de Debian:

apt-get install antiword

 

Conexión a Internet

Para conectar a Internet a través de Linux, y con pppd, hay que seguir los siguientes pasos:

-Editar el archivo /etc/ppp/options donde se ha de poner lo siguiente :

connect /etc/ppp/conexinetcrtsctsmodempassiveuser nom_usuario@servidor

noipdefaultdebugdefaultrouteasyncmap a0000/dev/modem57600

Se debe cambiar nom_usuario@servidor por el login de conexion a Internet. 57600 es la velocidad del módem , hay que poner la que corresponda. /dev/modem puede que se tenga que cambiar por /dev/ttyS0 o ttyS1 según el puerto del módem, la equivalencia con Windows es: ttyS0 = COM1 ; ttyS1 = COM2

-Crear un archivo de texto que se llame conexinet (o el que hayamos puesto en la línea connect /etc/ppp/archivo) con el siguiente contenido:

#!/bin/shchat -v "" atdtw(n: de conexion) CONNECT ""

El número de conexión es el facilitado por el proveedor de Internet. El de Infovía de antes era 055, por lo que quedraría asi:

chat -v "" atdtw055 CONNECT "".

Hay que asignar permisos de ejecución a este fichero, escribiendo en la línea de comandos:

chmod 755 conexinet

-Borrar el contenido del fichero pap-secrets y poner :

nom_usuario@servidor * password

El nombre de usuario y servidor es igual que el especificado en options, un * y la contraseña de conexión a Internet. Este fichero debe ser de sólo lectura y modificable por el usuario root, para conseguir esto hay que hacer lo siguiente:

chmod 600 pap-secrets

-Editar /etc/resolv.conf donde sólo tiene que aparecer :

domain servidor.esnameserver Ip_DNS_Primarionameserver Ip_DNS_Secundario

En servidor.es hay que poner el nombre de dominio de nuestro servidor. En los nameservers se deben especificar las direcciones de los servidores DNS.

Para conectar hay que escribir en la línea de comandos:

pppd

Para finalizar la conexión basta con poner en la línea de comandos :

killall pppd

Si la conexión da algun error. Por ejemplo: conecta y a los pocos segundos se desconecta repentinamente. Probar quitar la w de atdtw ( atdt ).

Esta conexión sólo funcionará ejecutando pppd como usuario root. En caso de que se quiera utilizar como otro usuario hay que hacer lo siguiente:

-Crear un link en el directorio /bin o /usr/bin de los archivos /usr/sbin/pppd y /usr/sbin/chat. Esto se hace porque para los usuarios no root es imprescindible ejecutar los comandos de /sbin usando ./comando, por lo cual ,en el script no funcionará la orden chat -v .... y lo de pppd , es para evitar tener que ir al /usr/sbin y poner ./pppd , y de esta forma poder hacerlo como queramos.

-Poner el pppd con suid: chmod +s pppd desde el directorio /usr/sbin. Asignar permisos de ejecución a /usr/sbin/chat: chmod 755 chat desde /usr/sbin.

Con ésto debería de estar bien, pero en Red Hat 6.0 da una serie de fallos que hay que solucionar como sigue:

Si se hace tail -f /var/log/messages se podrá ver que no se consigue realizar la conexión correctamente debido a fallos del tipo unsuport protocol, etc..

Para solucionarlo hay que poner las siguientes líneas en el fichero /etc/conf.modules

alias ppp-compress-21 bsd_compalias ppp-compress-24 ppp_deflatealias ppp-compress-26 ppp_deflate

Arrancar Linux con NTLoader (gestor de arranque NT/XP)

Si tenemos un sistema con NT o XP y usamos el gestor de arranque que estos incorporan para seleccionar entre XP y 98, por ejemplo, no es necesario perder ese sistema de arranque ni tocar el MBR para poder arrancar también Linux, y de paso, evitamos riesgos innecesarios en los cambios de configuración de arranque.

Como requisito, Linux ha de estar en una partición primaria, no servirá si lo tenemos en una partición extendida, pues allí no va a poder alojar su propio cargador en la partición que ocupa. Las particiones primarias son las que tengan un número igual o inferior a 4.

Suponiendo que la partición root de Linux es /dev/hda2 (segunda partición primaria del primer disco IDE), debemos instalar en ella (no en el MBR, ni en /dev/hda) uno de sus gestores de arranque habituales, como GRUB o LILO.

Teniendo el sistema en estas condiciones, ya desde Linux y como root, copiamos a un archivo el sector de arranque:

dd if=/dev/hda2 of=/bootsect.lnx bs=512 count=1

Movemos el archivo /bootsect.lnx recién creado a la partición iniciadora de Windows (si la tenemos montada), o a un diskette en caso contrario, del que luego lo copiaríamos a C:\ :

mv /bootsect.lnx /mnt/win_c//mnt/win_c sería la partición del Windows que inicia.

Desde Windows ahora, al archivo C:\boot .ini, le agregamos una entrada para que cargue Linux, basada en el archivo que le hemos agregado. Como probablemente esté oculto, primero le quitamos los atributos:

attrib -s -h c:\boot.ini

Editamos ya el boot.ini, agregándole una línea indicando la carga de Linux, dentro de la sección [operating systems], que diga:

C:\bootsect.lnx="Linux"

Grabamos el archivo modificado y le devolvemos sus atributos:

attrib -s -h c:\boot.ini

En el siguiente reinicio, ya dispondremos de opción de cargar Linux desde el mismo menú que teníamos los Windows.

¿Cómo puedo saber si un usuario está intentando entrarme por telnet?

Existen dos formas:

1- Se puede estar todo el rato tecleando la w y mirando quién está y qué hace en cada momento, pero no es lo recomendable.

2- En el archivo /etc/hosts.allow poner como tercer parámetro un comando, el que se quiera, y que le avise. Yo lo tengo para que haga un sonido cada vez que alguien conecta por telnet.

Por ejemplo, yo tengo esto en el /etc/hosts.allow:

ALL: ALL: spawn ( cat /usr/share/sounds/meepmeep.au > /dev/audio ) ; : ALLOW

que deja que se usen los servicios del inetd a todos, pero cuando alguien abra un puerto, ejecute el comando dado (saca un sonido).

 

Ver los directorios en colores con bash

El bash posee una propiedad muy interesante y útil mediante la cual es posible ver el listado de los archivos en colores diferentes que los identifican según su tipo.

Por ejemplo los ejecutables se ven en verde, los comprimidos en rojo, etc.

Para poder usar esta propiedad, hay que pasarle al comando ls el parámetro: --color=auto,

Y para que quede de forma permanente hay que definir en el archivo .bashrc los siguientes alias y variables de entorno:

eval `dircolors`alias ls='ls $LS_OPTIONS'

alias ll='ls $LS_OPTIONS -l'alias l='ls $LS_OPTIONS \lA'

Con esto estamos redefiniendo el "ls" y creando dos nuevos alias, "ll" y "l".

Cambiar el logo en el arranque de LinuxVersión para kernels 2.4

Todos hemos visto como muchas instalaciones de Linux presentan una imagen en la parte superior izquierda de la pantalla durante el arranque; por ejemplo la estrella de Mandrake, Tux con una cerveza en Woody,...

Si queremos hacer algo de "tunning linuxero", podemos incluir una imagen personalizada en nuestra instalación:

Necesitaremos:1.- Un logotipo (obvio, ¿verdad?2.- En fuente del kernel 2.4.x que vayamos a compilar. (próximamente para la familia 2.6)3.- El programa "fblogo"4.- Un Gimp o similar.5.- El editor de texto favorito de cada uno.Para comenzar, tendremos que tratar nuestro logo. Para ello símplemente tomaremos la imagen, cambiaremos el fondo a negro (recomendable pero no necesario) y la guardaremos en formato PNG con 223 colores como máximo y el tipo de color como indexado.

A continuación utilizaremos en programa fblogo para generar un archivo que utilizaremos en nuestro kernel mediante la orden "fblogo milogotipo.png linux_logo.h"

Copiamos el archivo "linux_logo.h" dentro del directorio donde hayamos descomprimido los fuentes del kernel, por ejemplo /usr/src/linux/include en la mayoria de los casos.

Abrimos el archivo drivers/video/fbcon.h con nuestro editor (por ejemplo 'joe', mi favorito o 'kate' en KDE) y cambiamos las lineas que definen el alto y ancho en pixeles del logo:#define LOGO_H <mi_tamaño_en_pixeles_de_alto>#define LOGO_W <mi_tamaño_en_pixeles_de_ancho>

A continuación compilaremos el kernel, sin olvidarnos de añadir soporte para FrameBuffer, instalamos... y listo!!!

Ya tendremos nuestra imagen favorita durante el arranque del sistema.

Sólo un consejo para acabar: CUIDADO CON EL TAMAÑO!!!!.No olvideis que el gráfico estará incluido dentro del núcleo, y eso ocupa espacio en memoria.

 

Cambiar el logo en el arranque de LinuxVersión para kernels 2.6

Cambiar la imagen que nos aparece en el arranque de un kernel 2.6 es algo más simple que en los núcleos 2.4.

Necesitaremos:1.- El logotipo2.- En fuente del kernel 2.6.x que vayamos a compilar.

Crearemos nuestra imagen con nuestro programa favorito (como buenos linuxeros que somos usaremos Gimp :wink: ), y la guardaremos en formato PNG.

A continuación ejecutamos los pasos siguientes:

1.- Ejecutar "convert logo.ext temporal1.ppm2.- ppmquant 224 temporal1.ppm > temporal2.ppm3.- pnmnoraw logo_passo2.ppm > logo_linux_clut224.ppm

Este logo lo copiaremos dentro del directorio donde hayamos descomprimido el kernel de Linux.En mi caso, he utilizado un kernel 2.6.5 (en el 2.6.6 no me funcionaba bien la tarjeta de sonido), así que lo que hacemos sería:

cp logo_linux_clut224.ppm /usr/src/kernel-source-2.6.5/drivers/video/logo/.

Seguidamente, configuraremos el núcleo con las opciones que necesitemos para nuestro hardware.Además tendremos que añadir el soporte de Framebuffer en el mismo: Dentro de "Device Drivers", nos vamos a "Graphics Support" y aqui encontraremos al final de la lista dos entradas: "Console display driver support" y "Logo configuration".En "Console display driver support", seleccionaremos las opciones "Video mode selection support", "Framebuffer Console support", "Select compiled-in fonts", y "VGA 8x16 font"

Dentro de "Logo configuration", seleccionamos "Bootup logo" y "Standard 224-color linux logo".

Salimos, salvamos la configuración, compilamos e instalamos el kernel.

Sólo con esto, en el próximo arranque que realicemos veremos como Tux se ha reemplazado por la imagen de nuestra elección.

 

Obligar a reiniciar cuando ocurre un Kernel Panic

Esto lo que hace es que si hay un kernel panic espera x segundos y luego reinicia la máquina.

#cat /proc/sys/kernel/panic0

El valor devuelto indica los segundos que esperará el kernel antes de reiniciar. El valor '0' indica que no se reiniciará nunca.

Si queremos habilitarlo, por ejemplo con 10 segundos de espera:

# echo "10" > /proc/sys/kernel/panic

Podemos comprobar el cambio con:

#cat /proc/sys/kernel/panic10

Este cambio no es permanente, por lo que, si queremos que lo sea, deberemos modificar el archivo /etc/sysctl.conf.

# echo "kernel.panic=10" >> /etc/sysctl.conf

También podemos pasarlo como parámetro durante el arranque, añadiendo 'panic=10' en nuestro cargador de arranque (grub o lilo).

Grabación USB lenta

Recientemente me he comprado un dispositivo de almacenamiento USB en memoria flash y aunque el rendimiento en lectura es "razonable" (960KB/s, de un máximo teórico de 1.4MB/s), la escritura es muy lenta. En mi máquina SUSE 10.0, escribo en ese dispositivo a unos 200KB/s. Es decir, unas cinco veces más lento de lo que debería.

Lo primero es descartar que el dispositivo USB tenga algún tipo de defecto, cosa que se comprueba con facilidad conectando el dispositivo a una máquina Windows. La comprobación experimental fue grabar 30 megabytes en la memoria USB, proceso que supuso un minuto de tiempo, aproximadamente. Es decir, unos 500KB/s, poco más o menos.

Así pues, la grabación es bastante lenta, pero en mi linux Suse es incluso más lenta todavía. Desesperantemente lenta, de hecho. ¡¡Llenar el gigabyte de capacidad de la memoria USB me supone casi una hora y media!!.

Investigando el asunto con detenimiento y la ayuda de Google, veo que el problema es que el subsistema "submount", utilizado por SUSE y otras distribuciones Linux para gestionar dispositivos removibles como USB o CDs/DVDs, "monta" los dispositivos USB con la opción de "sync".

Utilizar la opción "sync" tiene su lógica para así poder desenchufar el USB sin necesidad de realizar una operación explícita en el GUI, como la típica aplicación de Windows para "desenchufar dispositivo de forma segura". En Linux SUSE (y posiblemente otras distribuciones que empleen "submount"), se puede desenchufar el USB directamente porque el dispositivo se monta con la opción "sync", que implica que cuando escribimos algo se fuerza inmediatamente al dispositivo, sin pasar por la caché interna del sistema previamente. Por tanto, en cuanto el ordenador nos dice que ha terminado de grabar algo, realmente ha terminado de grabar en el dispositivo. De verdad.

El problema es que "sync" implica escrituras síncronas en el USB o, lo que es lo mismo, no envía al dispositivo el bloque X hasta que éste no haya confirmado que ha almacenado correctamente el bloque X-1. Ello supone un gran desperdicio de ancho de banda USB (y por tanto, tiempo de grabación), a cambio de ganar comodidad y conveniencia. Asimismo, puede haber efectos de segundo orden debido a que las memorias flash tienen un número de escrituras limitados, y en modo síncrono un sector determinado puede reescribirse varias veces durante una sesión de grabación.

Para comprobar si es el caso en vuestros sistemas, probad a conectar un dispositivo de almacenamiento USB, montadlo (o dejad que lo haga el sistema, si es

automático), y ved el resultado. En Linux SUSE 10.0, que utiliza "submount", parecerá algo parecido a:

# mount.../dev/sdb1 on /media/usbdisk type subfs (rw,nosuid,nodev,sync,fs=floppyfss,procuid,utf8=true)

El punto delicado es el "sync" resaltado en el listado anterior.

Una vez localizado el problema, la solución es muy simple. Basta con montar el dispositivo manualmente, pero indicándole que queremos utilizar escrituras asíncronas, más rápidas pero que exigen desconectar el USB de forma "controlada" (más sobre esto después).

La primera opción es desmontar el dispositivo y montarlo manualmente, con las opciones que nos interesan:

# mount.../dev/sdb1 on /media/usbdisk type subfs (rw,nosuid,nodev,sync,fs=floppyfss,procuid,utf8=true)# umount /media/usbdisk# mount -t subfs /dev/sdb1 /media/usbdisk -o rw,nosuid,nodev,fs=floppyfss,procuid,utf8=true# mount.../dev/sdb1 on /media/usbdisk type subfs (rw,nosuid,nodev,fs=floppyfss,procuid,utf8=true)

En el ejemplo anterior primero vemos las opciones con las que se monta el dispositivo USB. Seguidamente lo desmontamos manualmente y lo volvemos a montar con las mismas opciones que acabamos de ver PERO eliminando el modo "sync". Volviendo a visualizar las opciones, vemos que ya no aparece "sync". Como debe ser.

Otra opción más limpia es utilizar las funcionalidades "remount" de los kernel Linux modernos, para realizar las operaciones de forma más simple:

# mount.../dev/sdb1 on /media/usbdisk type subfs (rw,nosuid,nodev,sync,fs=floppyfss,procuid,utf8=true)# mount /media/usbdisk -o remount,async# mount.../dev/sdb1 on /media/usbdisk type subfs (rw,nosuid,nodev,fs=floppyfss,procuid,utf8=true)

Usemos la opción que usemos, si nuestro sistema emplea "submount" (el tipo de ficheros "subfs", como se puede ver en los ejemplos anteriores), el sistema operativo desmontará automáticamente el dispositivo USB cuando lo desenchufemos, como siempre.

No obstante, ahora tenemos que asegurarnos de que los datos se han almacenado realmente en el dispositivo de almacenamiento USB, ya que ahora las escrituras pasan por la caché de disco interna de Linux. Para ello hay varias opciones. Por ejemplo, en el escritorio KDE de SUSE hay un menú para "desenchufar de forma

segura", muy semejante a Windows (aunque con la configuración estándar de SUSE, al emplear escrituras síncronas, es innecesario). Otra opción, ya que tenemos una ventana de terminal abierta, es utilizar el comando "sync" de Unix para asegurarnos de que todos los datos modificados en la caché de escritura de Linux son volcados a los sistemas de almacenamiento del ordenador. Este comando puede tardar bastante tiempo en "terminar" (lo que tarde en grabar todo lo pendiente que mantenía en RAM, la caché), pero cuando acabe significará que no queda nada pendiente y podemos desenchufar el USB sin problemas.

Por tanto, utilizando un simple comando "mount /media/usbdisk -o remount,async" consigo pasar de grabar a una velocidad de 200KB/s a grabar a 560KB/s. Casi tres veces más rápido. E igual de rápido que con Windows.

Por supuesto las velocidades concretas dependerán de cada dispositivo USB. El mío es bastante "cutre", ya se ve, porque incluso a su velocidad de "pico" graba a la mitad de la capacidad del estándar USB 1.1. Pero menos da una piedra...

Pero vuelvo a reiterar: ¡mucho cuidado con asegurarnos de que todos los datos se han grabado en el dispositivo de almacenamiento USB ANTES de desenchufarlo del ordenador!. Recuerda utilizar el comando "sync" o similares, al terminar la grabación.

El único efecto secundario de trabajar en modo asíncrono, aparte de requerir que seamos cuidadosos, es que una vez que el sistema nos dice que ha terminado de grabar, todavía puede tardar varios minutos en completar realmente todas las operaciones pendientes que contenga en su caché en RAM. Y el acceso de lectura a un dispositivo USB mientras se está grabando en él a toda velocidad, suele ser bastante lento y poco cómodo. Por ejemplo, si durante la grabación pulsamos "cancelar", aún se pueden almacenar muchos megas adicionales y podemos tener que esperar fácilmente un minuto o dos hasta que realmente aborta la operación. Exactamente igual que en Windows...

Comandos Consola Windows XP

Además de las numerosas opciones de configuración que incluye Windows XP en el Panel de Control, existen otras opciones adicionales que sólo son accesibles a través de ciertos comandos.

El sistema operativo Microsoft Windows XP incluye muchas funciones a las que tan sólo podemos acceder a través de la consola de comandos. A menudo estas herramientas nos pueden ayudar a mejorar el rendimiento de nuestro sistema operativo, diagnosticar y corregir problemas o simplemente obtener más información sobre la configuración de nuestro equipo.

Para acceder a la consola de comandos, tan sólo tendremos que ir al menú Inicio, seleccionar la opción ejecutar y escribir cmd.exe ó simplemente cmd. También podremos acceder a este menú mediante la combinación del teclado tecla Windows+R.

Para obtener ayuda adicional sobre un comando, las opciones que incluye y algunos ejemplos de uso, tan sólo tendremos que añadirle la opción /h ó /?.

Archivos y sistemas de ficheros

cacls: Permite modificar los permisos en ficheros y carpetas, permitiendo o prohibiendo a cada usuario leer, escribir o modificar el contenido de dichos archivos o carpetas.

chkdsk: Comprueba el estado de una partición y repara los daños en caso de que encuentre alguno. Si lo ponemos sin ningún parámetro simplemente escaneará la partición, si queremos que además corrija los errores, deberemos añadir la opción /F, es decir, chkdsk /F.

cipher: Permite cifrar archivos, directorios o particiones siempre que se encuentren en el sistema de archivos NTFS.

comp: Compara archivos o carpetas y muestra las diferencias existentes entre ellos.

compact: Permite comprimir archivos o carpetas para ahorrar espacio en el disco duro. Para comprimir los archivos deberemos utilizar el modificador /c y para descomprimirlo en modificador /u. Por ejemplo, para comprimir la carpeta c:\pruebas debemos utilizar el comando compact /c c:\pruebas y para descomprimirla compact /u c:\pruebas.

convert: Convierte particiones FAT ó FAT32 a NTFS. Antes de utilizar este comando es recomendable realizar una copia de seguridad puesto que es posible que durante la conversión se pierdan datos.defrag: Desfragmenta los archivos de una unidad, similar a la utilidad Defragmentador de discos de Windows pero en modo consola.

diskpart: Permite crear, eliminar y administrar particiones. Este programa en modo consola debemos utilizarlo con cuidado puesto que es fácil que eliminemos sin darnos cuenta todo el contenido del disco duro o de la partición activa.

find y findstr: Estos comandos buscan cadenas de textos en el interior de uno o varios archivos. Sin embargo, el comando findstr ofrece más opciones de búsqueda que el comando find.

iexpress: Este comando lanzará un asistente para crear archivos comprimidos .CAB autodescomprimibles.

openfiles: Muestra a un administrador los archivos abiertos en un sistema a un administrador y permite desconectarlos si se han abierto a través de red.

Configuración del sistema

bootcfg: Permite ver y modificar las entradas del archivo boot.ini. Estas entradas nos permiten seleccionar con que sistema operativo deseamos iniciar el equipo.

control userpasswords2: Permite modificar las claves y los permisos de los diferentes usuarios, así como requerir la pulsación de control+alt+suprimir para poder iniciar sesión, haciendo el inicio de sesión más seguro.

driverquery: Hace un listado de todos los drivers instalados en el sistema y muestra información sobre cada uno de ellos.

dxdiag: Lanza la herramienta de diagnóstico de Direct X, con la cual podremos comprobar la versión Direct X que tenemos instalada y permite comprobar mediante tests que todo lo referente a estos controladores funcione correctamente.

gpresult: Muestra información sobre las políticas de grupo aplicadas a un usuario.

gpupdate: Vuelve a aplicar las políticas de grupo.

msconfig: Desde esta aplicación en modo gráfico podremos seleccionar que programas y servicios se cargan durante el inicio de Windows así como los sistemas operativos que el usuario puede seleccionar para iniciar el ordenador.

pagefileconfig: Permite configurar el archivo de paginación de Windows.

prncnfg: Muestra información sobre las impresoras instaladas

prnjobs: Muestra información sobre los trabajos de impresión en cola.

reg: Permite ver y modificar valores del registro de Windows. Las opciones posibles son:

reg query => realiza una consulta en el registro

reg add => añade una entrada al registro

reg delete => elimina una clave del registro

reg copy => copia una clave del registro a otra parte del registro o a otro equipo

reg save => guarda una parte del registro en un archivo

reg restore => restaura una parte del registro de un archivo

reg load => carga una clave o árbol al registro desde un archivo

reg unload => descarga una clave o árbol del registro

reg compare => compara varios valores del registro

reg export => exporta el registro o parte del registro a un archivo

reg import => importa el registro o parte del registro de un archivo

regedit: Editor del registro en modo gráfico.

sc: Este commando nos permite administrar los servicios, ya sea iniciar uno, detenerlo, mandarle señales, etc.

sfc: Este comando permite buscar archivos del sistema dañados y recuperarlos en caso de que estén defectuosos (es necesario el CD de instalación del sistema operativo para utilizarlo). Para realizar una comprobación inmediata, deberemos ejecutar la orden sfc /scannow.

systeminfo: Muestra información sobre nuestro equipo y nuestro sistema operativo: número de procesadores, tipo de sistema, actualizaciones instaladas, etc.

taskkill: Permite eliminar un proceso conociendo su nombre o el número del proceso (PID).

tasklist: Realiza un listado de todos los procesos que hay. Útil si deseamos eliminar un proceso y no conocemos exactamente su nombre o su PID.

Redes

arp: Muestra y permite modificar las tablas del protocolo ARP, encargado de convertir las direcciones IP de cada ordenador en direcciones MAC (dirección física única de cada tarjeta de red).

ftp: Permite conectarse a otra máquina a través del protocolo FTP para transferir archivos.

getmac: Muestra las direcciones MAC de los adaptadores de red que tengamos instalados en el sistema.

ipconfig: Muestra y permite renovar la configuración de todos los interfaces de red.

nbtstat: Muestra las estadísticas y las conexiones actuales del protocolo NetBIOS sobre TCP/IP, los recursos compartidos y los recursos que son accesibles.

net: Permite administrar usuarios, carpetas compartidas, servicios, etc. Para un listado completo de todas las opciones, escribir net sin ningún argumento. Para obtener ayuda sobre alguna opción en concreto, escribier net help opción.

netsh: Este programa en modo consola permite ver, modificar y diagnosticar la configuración de la red

netstat: Mediante este comando obtendremos un listado de todas las conexiones de red

que nuestra máquina ha realizado.

nslookup: Esta aplicación se conecta a nuestros servidores DNS para resolver la IP de cualquier nombre de host. Por ejemplo, si ejecutamos nslookup y escribimos dominio.com, nos responderá con algo como:

Respuesta no autoritativa:Nombre: dominio.comAddress: ip

pathping: Muestra la ruta que sigue cada paquete para llegar a una IP determinada, el tiempo de respuesta de cada uno de los nodos por los que pasa y las estadísticas de cada uno de ellos.

ping: Poniendo detrás del comando ping el nombre o la dirección IP de la máquina, por ejemplo ping 192.168.0.1 enviaremos un paquete a la dirección que pongamos para comprobar que está encendida y en red. Además, informa del tiempo que tarda en contestar la máquina destino, lo que nos puede dar una idea de lo congestionada que esté la red.

rasdial: Permite establecer o finalizar una conexión telefónica.

route: Permite ver o modificar las tablas de enrutamiento de red.

tracert: Muestra el camino seguido para llegar a una IP y el tiempo de respuesta de cada nodo.

Varios

at: Permite programar tareas para que nuestro ordenador las ejecute en una fecha o en un momento determinado.

logoff:: Este comando nos permite cerrar una sesión iniciada, ya sea en nuestro ordenador o en otro ordenador remoto.

msg:: Envía un mensaje a unos o varios usuarios determinados mediante su nombre de inicio de sesión o el identificador de su sesión

msiexec:: Permite instalar, desinstalar o reparar un programa instalado mediante un paquete MSI (archivos con extensión .msi).

runas: Permite ejecutar un programa con privilegios de otra cuenta. Útil por ejemplo si estamos como usuario limitado y queremos hacer algo que necesite privilegios de administrador.

shctasks: Permite administrar las tareas programadas.

shutdown: Permite apagar, reiniciar un ordenador o cancelar un apagado. Es

especialmente útil si hemos sido infectado con el virus Blaster o una de sus variantes para cancelar la cuenta atrás. Para ello, tan sólo tendremos que utilizar la sintaxis shutdown -a.

Microsoft Management Console (MMC)

Estos comandos nos darán acceso a distintas partes de la Microsoft Management Console, un conjunto de pequeñas aplicaciones que nos permitirán controlar varios apartados de la configuración de nuestro sistema operativo.

Para acceder a estas opciones, no es necesario entrar en la consola del sistema (cmd.exe), sino que basta con introducirlos directamente desde inicio - ejecutar.

ciadv.msc: Permite configurar el servicio de indexado, que acelera las búsquedas en el disco duro.

compmgmt.msc: Da acceso a la Administración de equipos, desde donde podemos configurar nuestro ordenador y acceder a otras partes de la MMC.

devmgmt.msc:: Accede al Administrador de dispositivos.

dfrg.msc: Desfragmentador del disco duro.

diskmgmt.msc: Administrador de discos duros.

fsmgmt.msc: Permite administrar y monitorizar los recursos compartidos.

gpedit.msc: Permite modificar las políticas de grupo.

lusrmgr.msc: Permite ver y modificar los usuarios y grupos locales.

ntmsmgr.msc: Administra y monitoriza los dispositivos de almacenamientos extraíbles.

ntmsoprq.msc: Monitoriza las solicitudes del operador de medios extraíbles.

perfmon.msc: Monitor de rendimiento del sistema.

secpol.msc: Configuración de la política de seguridad local.

services.msc: Administrador de servicios locales.

wmimgmt.msc: Configura y controla el servicio Instrumental de administración (WMI) de Windows.

Como podemos comprobar, muchas de las opciones aquí listadas sólo son accesibles a través de esta consola, por lo que tareas como personalizar nuestro sistema de acuerdo a nuestros gustos, adaptarlo a nuestras necesidades con una mayor precisión o

simplemente por conocer cómo funciona nuestro sistema operativo o cómo está configurado podemos realizarlas con ayuda de estos menús ocultos

 

Conexiones GSM, GPRS, 3G+, UMTS, HSDPA

Definiciones

GSM son las siglas de Global System for Mobile communications (Sistema Global para las comunicaciones Móviles), es el sistema de teléfono móvil digital más utilizado y el estándar de facto para teléfonos móviles en Europa. La mayoría de las redes GSM utilizan 900MHz y 1800MHz en los EE.UU., pero la 850MHz y 1900Mhz ocupan un lugar destacado. El teléfono es un teléfono de triple banda y puede ser utilizado en Europa, los EE.UU. y muchos otros territorios (a condición de la tarjeta SIM está activado). Si usted necesita el acceso móvil en el Lejano Oriente y zonas como Escandinavia tendrá que verificar con su proveedor de servicios móviles debido que se necesita como mínimo un teléfono de cuádruple banda y se requiere en algunas zonas sólo un teléfono comprado en el país funcionara.

La mayoría de los teléfonos GSM se utilizan principalmente para voz, pero puede ser utilizado para acceso móvil a Internet a través de la red básica de GPRS.

GPRS, General Packet Radio Service o servicio general de paquetes vía radio es una extensión del Sistema Global para Comunicaciones Móviles (Global System for Mobile Communications o GSM) para la transmisión de datos no conmutada (o por paquetes). Existe un servicio similar para los teléfonos móviles que del sistema IS-136. Permite velocidades de transferencia de 56 a 144 kbps. Permite como mucho 80 Kbps, o sea 0,08 “Megas” de velocidad. Similar a un viejo moden telefónico de los que ya no se usan- GPRS es un sistema probado y por lo tanto es muy confiable para el uso estándar de datos móviles y se ajusta a las personas con moderadas necesidades de datos. Una vez que haya realizado los ajustes necesarios en su lugar puede utilizar la red siempre que lo desee y que no requiere ningún otro ajuste, ya que funciona en el fondo de sus aplicaciones de Internet.

EDGE o EGPRS, Enhanced Data rates for GSM of Evolution (Tasas de Datos Mejoradas para la evolución de GSM), es decir, el anterior mejorado, permite has un máximo de conexión de 236 Kbps, es decir 0,236 “Megas”. Es un reciente desarrollo basado en el sistema GPRS y ha sido clasificado como un «3G» estándar debido a que puede funcionar en un máximo de 473,6 kbits por segundo. Si un teléfono inteligente es compatible con EDGE puede ser utilizado para la transmisión de datos móviles pesados, tales como la recepción de grandes archivos adjuntos de correo electrónico y navegar por páginas web complejas a gran velocidad. Para utilizar EDGE, las torres de celular

deben de ser modificadas para aceptar las transmisiones de este tipo de cobertura puede ser tan irregular en algunas zonas-que es una tecnología que vale la pena haber construido en cualquier teléfono.

3G o UMTS, Universal Mobile Telecommunications System, la tercera generación de sistemas para móviles (3G).. Los servicios asociados con la tercera generación proporcionan la posibilidad de transferir tanto voz y datos (una llamada telefónica) y datos no-voz (como la descarga de programas, intercambio de email, y mensajería instantánea).Permite velocidades de conexión de hasta 2 Mbps (2 megas en el lenguaje coloquial) pero esto sólo en condiciones óptimas, claro. Ahora mismo con esta conexión en 3G le he hecho un Speedtest y no pasa de 0,4 Mbps con una señal de recepción ”dos rayitas” sobre 5.

HSDPA , (High Speed Downlink Packet Access) es la optimización de la tecnología espectral UMTS/WCDMA, pudiendo alcanzar velocidades de bajada de hasta 14 Mbps en teoría en condiciones óptimas, pero yo solo he conseguido 1 Mbps con la mejor señal posible. Tal vez este sea el límite actual que nos ofrece el sistema de Internet móvil..La tecnología HSDPA (High Speed Downlink Packet Access), también denominada 3.5G, 3G+ or turbo 3G, es la optimización de la tecnología espectral UMTS/WCDMA, incluida en las especificaciones de 3GPP release 5 y consiste en un nuevo canal compartido en el enlace descendente (downlink) que mejora significativamente la capacidad máxima de transferencia de información pudiéndose alcanzar tasas de hasta 14 Mbps. Soporta tasas de throughput promedio cercanas a 1 Mbps

HSUPA , (High-Speed Uplink Packet Access o Acceso ascendente de paquetes a alta velocidad) es un protocolo de acceso de datos para redes de telefonía móvil con alta tasa de transferencia de subida (de hasta 7.2 Mbit/s). Calificado como generación 3.75 (3.75G) o 3.5G Plus, es una evolución de HSDPA (High-Speed Downlink Packet Access, Acceso descendente de paquetes a alta velocidad, nombrado popularmente como 3.5G). La solución HSUPA potenciará inicialmente la conexión de subida UMTS/WCDMA (3G). HSUPA está definido en Universal Mobile Telecommunications System Release 6 estándar publicado por 3GPP (www.3GPP.org), como una tecnología que ofrece una mejora sustancial en la velocidad para el tramo de subida, desde el terminal hacia la red. HSDPA y HSUPA, ofrecen altas prestaciones de voz y datos, y permitirá la creación de un gran mercado de servicios IP multimedia móvil. HSUPA mejorará las aplicaciones de datos avanzados persona a persona, con mayores y más simétricos ratios de datos, como el e-mail en el móvil y juegos en tiempo real con otro jugador. Las aplicaciones tradicionales de negocios, junto con muchas aplicaciones de consumidores, se beneficiarán del incremento de la velocidad de conexión.

Consumo de Batería H, 3G ,G, E

G = GPRS + ó - 1.5 MbE = Edge 1.7 Mb3G = 3G 2 Mb+3G = +3G 2.5 MbH = HSDPA Hasta 7.2 Mb

HSDPA -> 3.5G3G -> 3G

EDGE -> 2.5GGSM/GPRS -> 2G

GSM/WCDWA -> MODO AUTOMÁTICO. Si tienes cobertura tendras 3G o H, si no E o GSolo GSM -> Solo E o GSolo WCDMA -> Solo 3G o H

El HSDPA consume mucho más batería que el WIFI. El HSDPA es una tecnologia multicanal. Utiliza varios canales tanto en la transmisión como en la recepción (similiar a la tecnologia de MIMO del WIFI), para lograr mayores tasas de velocidades. El uso de canales adicionales implica mayores consumo de energía.

Si tenéis una cobertura mediocre en HSDPA y resulta que el móvil va cambiando cada dos por tres entre 3G y H, lo mejor para ahorrar más batería es desactivar el modo HSDPA porque la mayoría de veces no se suele notar demasiado incremento en velocidad (muchas tarifas 3G van capadas en cuanto a velocidad) y está demostrado que cuando sale una H se consume casi el doble de batería que si hay sólo 3G.

Tanto con el G, 3H y HSDPA puedes entrar a internet, enviar y recibir mms y videollamadas, lo unico que cambia es la velocidad de transferencia de datos

El tipo de datos 2g/3g óptimo dependerá de el uso que hagas:- 2G: consume menos batería en stand by, pero más en envío y recepción.- 3G: consumo más batería en stand by, pero menos en envío y recepción.

Desactivar HSDPA si no se necesita, otra forma de ahorrar

Ejemplo: Samsung Galaxy S

Si tenéis una cobertura mediocre y resulta que el móvil va cambiando cada dos por tres entre 3G y H, lo mejor para ahorrar más batería es desactivar el modo HSDPA porque la mayoría de veces no se suele notar demasiado incremento en velocidad (muchas tarifas 3G van capadas en cuanto a velocidad) y está demostrado que cuando sale una H se consume casi el doble de batería que si hay sólo 3G.

Así pues, si queréis desactivar el HSDPA, seguid estos pasos:

En el marcador telefónico escribid: *#301279#Se os abre un menú. Seleccionad CHANGE HSPA VERSIONY aquí, RELEASE 99 (HSPA OFF)

Salid con la tecla atrás o como queráis. Ya no tenéis HSDPA...

Si por lo que sea queréis volver a tener HSDPA, el proceso es reversible de forma similar:

En el marcador telefónico escribid: *#301279#Se os abre un menú. Seleccionad CHANGE HSPA VERSIONY aquí, RELEASE 6 (HSDPA/HSUPA)

 

Conexiones con el smartphone

Conexión en itinerancia: este icono aparece cuando salimos de nuestro país y conectamos a la red de algun operador de otro país. Hay que ir con cuidado porque las tarifas son abusivas. Una cosa muy importante a hacer es ir a la configuración de las redes móviles y desmarcar la opción "Conectar con redes en itinerancia". También se les conoce como Roaming.Conexión 2G sin datos: es la conexión que deberías de tener si no tienes buena cobertura o si no tienes contratada una tarifa mensual de internet en el móvil. Con este icono no podrás usar los servicios de transmisión de datos como Internet, correo electrónico...Conexión 2G GPRS: es la conexión de datos más lenta, de unos miserables 6 KB/s (equivalente a una conexión módem antigua de 56 kbps). No vale la pena navegar en GPRS, ya que, literalmente, puedes ir al baño mientras carga.Conexión 2.5G (EDGE): es una mejora del GPRS, que permite navegar a velocidades más aceptables que el GPRS, pero sin llegar, ni de lejos, a las conseguidas por las 3G.Conexión 3G (UMTS): 3G y UMTS son palabas sinónimas; tiene una cobertura de entre el 70 y el 85% y te permite navegar a alta velocidad.Conexión 3.5G (HSPA): la tecnología HSPA es la más rápida de la actualidad (en el mercado español) y permite velocidades de hasta 7Mbps de bajada (HSDPA) y 2 Mbps de subida (HSUPA). Está presente en los núcleos urbanos sobretodo y suele representarse con el icono H.

 

Tipo de red preferido

 

Marcar este código: *#*#4636#*#*

Luego en la "Información sobre el teléfono" bajamos hasta "Establecer tipo de red preferido"

Resumen:

WCDMA preferred: Utiliza 2G y 3G. Aunque la señal sea débil, busca siempre la mejor forma de establecer conexión vía 3G.

GSM only: Utiliza 2G. Si la señal es débil, no utiliza ninguna. WCDMA only: Utiliza 3G. Si la señal es débil, no utiliza ninguna. GSM auto (PRL): Utiliza 2G y 3G. Si la señal es débil, usa 2G.

Explicación:

GSM only: Si no necesitas conexiones rápidas ésta es la opción que más ahorro de batería producirá conectándote principalmente a las redes 2G

GSM auto (PRL): Un buen equilibrio entre velocidad y batería: Intentará usar redes 3G pero no estará constantemente buscando Conexiones mejores.

WCDMA Only: Si vives en un sitio con poca covertura GSM pero buena covertura HSDPA ésta es la opción que te interesa. Gasta más batería que en la anterior.

WCDMA preferred: Gasta menos batería que el únicamente WCDMA. WCDMA only: El que gasta más batería buscando únicamente la conexión más

rápida.

Por defecto, la selección suele ser WCDMA preferred, donde buscamos la mayor velocidad posible a cualquier precio. Sin embargo, la GSM auto puede ser una buena estrategia para reducir esas búsquedas (y gasto de batería) a favor de sacrificar un poco la cobertura.

Calibrar la bateria

Ccalibrar NO hace que dure mas, hace que el indicador de la bateria muestre fielmente lo que te queda de bateria, pero no hace que dure mas.

Si la tienes calibrada... tanto al principio como al final de la duración el % se ajusta a la carga real.

Si no esta calibrada...no marca lo que le queda, pero al final de su duracion se empieza a "parecer" más, y el ultimo 10% mas o menos ya si es real lo que marca con lo que queda.

En resumen: Que si, que es bueno calibrar, pero no os durara mas.

Consumo de la batería y recarga

Piensa que las baterias que incorporan nuestros moviles no tienen efecto memoria como tal, si es cierto que con el tiempo pierden capacidad de tension , y por lo tanto de duración.

Ahora, el sistema es otra cosa, probablemente cuando hicistes el wipe no estaba 100 % cargada , entonces el movil se cree que tiene menos bateria de la que tiene. La prueba de esto es facil, cuando veas que de repente te baja un 20 % reinicia el movil, veras como por arte de magia el % cambia, haz esto un par de veces hasta que el movil ya no encienda de verdad .

Una vez que le movil este totalmente muerto , cargalo sin encenderlo , cuando este full arrancalo, y que siga cargando, cuando este full vuelve a apagarlo y deja que se vuelva a cargar ...y esto repetitivo hasta que veas que simplemente pasan 2 segundo o es practicamente inmediato en sonarte el lleno ... entonces entra en recovery y haz el wipe . resetealo ( bajo mi punto de vista con el cargador enchufado, mas tarde explico el

porque ) y espera que se cargue del todo , ahi desenchufalo y empieza tu vida de forma normal :-)

Lo de reiniciar tantas veces es por que una cosa es lo que la bateria puede almacenar y lo que el sistema cree que ha almacenado, a las baterias de litio es muy dificil hacerlas daño por intentar alamacenar de mas, y asi te aseguraras de que verdad a cogido la tension adecuada.

Respecto al cable enchufado, aqui hay diferencia de opiniones, por lo que yo se las baterias de litio tienen un pico de aguante muy superior al valor nominal que entregan ( en el caso de las samsung mas ya que los cargadores estan "trucados" casi 0.3 A para que algunos cargadores chinos no carguen ) por lo que si lo dejas arrancar sin cargador elmovil entendera que ese es el maximo pico de almacenaje , sin embargo con el cable enchufado entregaras un 8% mas , que luego el sistema intentara cargar ...

Suerte y a disfrutar ... y no olvidarse que estos moviles son muy modernos, pero las baterias poco potentes asi que el cargarlo a diario es imprencindible y que estas baterias duran mas si no bajan de un 40-20 % de carga cuando las pones a cargar ( por el mismo rollo de la tension ) "

Todo sobre este misterioso proceso de Windows --> SVCHOST.exe

El misterioso archivo SVCHOST.exe

El archivo Svchost.exe se encuentra en la carpeta C:\WINDOWS\system32\svchost.exe en Windows XP y C:\WINNT\system32\svchost.exe en Windows 2000.

Al iniciarse, Svchost.exe comprueba la parte de servicios del Registro para elaborar la lista de servicios que necesita cargar. Se pueden ejecutar múltiples instancias de Svchost.exe al mismo tiempo. Cada sesión de Svchost.exe puede contener un conjunto de servicios, para que se puedan ejecutar servicios autónomos, en función de cómo y cuándo se inició Svchost.exe. Esto permite un control mejor y una depuración más sencilla.

Los grupos Svchost.exe están identificados en la siguiente clave del Registro:

HKEY_LOCAL_MACHINE\Software\Microsoft\WindowsNT\CurrentVersion\Svchost

Cada valor contenido en esta clave representa un grupo Svchost distinto y se muestra

como un ejemplo independiente cuando se consultan los procesos activos.

Cada valor es un valor REG_MULTI_SZ que contiene los servicios que se ejecutan en el grupo Svchost. Cada grupo Svchost puede contener uno o varios nombres de servicio que se extraen de la siguiente clave del Registro, cuya clave Parámetros contiene un valor ServiceDLL:

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\ Nombre del Servicio

Por esta razon, suele aparecer varias veces en la lista de procesos en ejecucion.

Para ver la lista de servicios que se ejecutan en Svchost y los otros procesos:

1. Haga clic en el boton Inicio en la barra de tareas de Windows y, a continuación, en Ejecutar.

2. En el cuadro de diálogo Abrir, escriba CMD y, a continuación, presione la tecla Enter.

3. Ahora en la ventana de la consola de comandos, escriba:

Tasklist /SVC

... y a continuación, presione Enter.

Te aparecerá un listado de los procesos activos y los servicios del sistema asociados con dichos procesos "si los hay" (en caso contrario muestra N/D, no disponible).

Tasklist muestra una lista de los procesos activos. El modificador /SVC muestra la lista de servicios activos para cada proceso.

Si tienes Windows XP Professional y quieres obtener más informacion sobre los servicios que el proceso SVCHOST está ejecutando en estos momentos haz esto:

1. Haga clic en el boton Inicio en la barra de tareas de Windows y, a continuación, en Ejecutar.

2. En el cuadro de diálogo Abrir, escriba CMD y, a continuación, presione la tecla Enter.

3. Ahora en la ventana de la consola de comandos, escriba:

tasklist /svc /fi "imagename eq svchost.exe"

... y a continuación, presione Enter.

En este caso se mostrarán sólo los procesos SVCHOST.exe y sus servicios asociados.

Y la respuesta a la típica pregunta de si hay que cerrar o eliminar el proceso SVCHOST, NO! no hay que tocarlo, este programa es importante para estabilidad y seguridad de su sistema y no deberia ser terminado.

Uso de recursos del sistema

Uso de memoria:

SVCHOST.EXE puede llegar a ocupar hasta unos 60MB de la memoria de sistema. SVCHOST.EXE puede aparecer listado en la lista de procesos muchas veces por cada servicio que éste tenga activos.

Uso de procesador:

El uso de procesador por parte de SVCHOST.EXE no debe ser mas de 20% en algunos casos, (en mi caso personal en este momento solo un 0%) éste uso de CPU no debe ser permanente, o sea no debe ocupar CPU en todo momento a menos que en tu sistema se esté ejecutando alguna aplicacion de red crítica que siginifique el uso de todos estos recursos en todo momento, si no es así, sospecha de que estas siendo atacado externamente por algun bicho que aprovecha la vulnerabilidad RPC. (más abajo)

SVCHOST, los puertos que abre y su configuracion con Firewalls

Como vimos anteriormente, SVCHOST.exe puede aparecer varias veces cargado en el sistema, de hecho, mientras escribo éste artículo, SVCHOST.exe aparece en la lista de procesos 6 veces, ocupando algo así como 45MB de memoria, este aparece cargando los servicios DcomLaunch, TermService, RpcSs,AudioSrv, Browser, CryptSvc, Dhcp, dmserver, ERSvc, EventSystem, FastUserSwitchingCompatibility, helpsvc, HidServ, lanmanserver, lanmanworkstation, Netman, Nla, rasAuto, RasMan, Schedule, seclogon, SENS, SharedAccess, ShellHWDetection, Tapisrvc, Themes, trkWks, winmgmt, wscsvc, wuauserv, WZCSVC, LmHosts, SSDPSRV, upnphost, WebClient, stisvc y HTTPFilter, pero, como si fuera poco, si tienes un Firewall, y alguna vez has visto listados los puertos que el proceso SVCHOST.exe tiene para sí, encontraras que SVCHOST.exe es el responsable de tener abiertos varios puertos del sistema.

"SVCHOST.exe no solo es el responsable de cargar varios servicios,tambien abre numerosos puertos de conexion a nuestro sistema."

En mi caso, SVCHOST.exe tiene abiertos los siguientes puertos:

Con protocolo TCP: 135 y 2869

Con protocolo UDP: 53, 1035, 1036, 1900, 2030 y 3031

Cuando estes en busca de procesos maliciosos como Adware, software espía, etc, puedes confiar en que los puertos abiertos relacionados con SVCHOST.exe no han sido abiertos con mala intencion. Claro que ataques externos en contra de esos puertos (por ejemplo: Ataques a Llamadas a Procedimiento Remoto RPC "call—RPC—attacks" en contra del puerto 135) no se pueden descartar.

En el mundo de los Firewalls, al proceso del archivo SVCHOST.exe, se le conoce como [GENERIC HOST PROCESS FOR WIN32 SERVICES].

La mayoría de los Firewalls traen reglas predefinididas cuando las conexiones son de salida, pero cuando hay peticiones entrantes, toca definir dos reglas:

Si el protocolo es TCPSi la conexion es de tipo ENTRADABLOQUEAR

Si el protocolo es UDPSi la conexion es de tipo ENTRADABLOQUEAR

Hay casos raros, muy raros... en que las reglas predefinidas de conexiones de salida no son suficientes, si este es su caso, (si experimenta momentos en que el Firewall le pregunta sobre que una aplicacion solicita conexion de salida usando protocolo TCP), convendría definir esta regla:

Si el protocolo es TCPSi la conexion es de tipo SALIDABLOQUEAR

Ataques a tu sistema mediante RPC

El Proceso ó Archivo SVCHOST consume 100% CPU

Si experimentas problemas de lentitud, y notas que el proceso SVCHOST.exe está consumiendo recursos de CPU de forma excesiva y sin control, es muy probable que estes siendo objeto de ataques mediante la vulnerabilidad conocida del RPC.

Mediante dicha vulnerabilidad, existen y continuan apareciendo infinidad de bichos que aprovechan este agujero para insertarse en tu sistema y empezar a hacer todo tipo de travesuras, bicho que normalmente se conoce como msblaster o alguna mutacion.

Si crees estar siendo víctima del MS Blaster o alguna de sus miles de mutaciones:

Inmediatamente ve descargando e instalando los dos parches para el Agujero del LSASS y el RPC/DCOM

Cuando los instales, reinicias, te conectas a Internet y compruebas si el uso de CPU del archivo SVCHOST.EXE es ahora normal. Si no lo es, y notas que continua igual que antes, entonces publica el registro detallado de las aplicaciones de tu sistema usando la aplicacion, HIJACKTHIS.

IMPORTANTE:

Si lo que tienes es el gusano, con el antivirus NO BASTA, tienes que parchear el error (con el parche RPC, que corrige el agujero de una vez por todas) porque existen infinidad de bichos que aprovechan ese agujero pero que utilizan otro nombre, por lo que si el Antivirus no es tan potente, desconocerá las nuevas mutaciones.

Para tener claro...

El archivo se llama SVCHOST.exe, no confundir con virus que se hacen llamar SVHOST.exe o SVCSHOST.exe, etc.

Este archivo SVCHOST.exe sólo debe aparecer en Windows 2000 y XP. Su ubicacion debe ser C:\WINDOWS\system32\svchost.exe en Windows XP y

C:\WINNT\system32\svchost.exe en Windows 2000. No importa si SVCHOST.EXE aparece repetido varias veces en la lista de

procesos, esto es normal. SVCHOST.EXE puede llegar a ocupar hasta unos 60MB de la memoria de

sistema. Solo preocúpate si el uso de procesador por parte de SVCHOST.EXE es excesivo, no debe ser mas de 20% en algunos casos. (en mi caso personal solo un 1%) El uso del CPU es aleatorio y circunstancial, no debe ocupar CPU en todo el momento, si es así, sospecha de que estas siendo atacado externamente por algun bicho que aprovecha la vulnerabilidad RPC.

Atajos de Teclado en Windows

Atajos de teclado en Windows

La tecla Windows

Tecla Windows : Abre el menu de inicioTecla Windows + D (de Desktop): Acceder directamente al escritorioTecla Windows + E (de Explorer) : Abre la ventana de MI PCTecla Windows + F (de Find).: Abre la ventana de busquedaTecla Windows + F1 : Abre la ventana de ayudaTecla Windows + L (de Login) : Regresas a la pantalla de Bienvenida, para cambiar de usuario Tecla Windows + R (de Run) : Abre la ventana del cuadro EjecutarTecla Windows + M : Minimiza todas las ventanas de tengas abiertasTecla Windows + Boton arriba + M : Restablece todas las ventanas que tengas minimizadasTecla Windows + U (de Utilities). Hace aparecer las utilidades de accesibilidad (a partir de Windows 2000). Tecla Windows + Pausa Inter : Abre las propiedades del sistemaTecla Windows + Pausa. Hace aparecer el menú de Propiedades del Sistema.

 

La tecla ALT

Ésta tecla es aún más misteriosa que la de Windows para el usuario novel. Lo bueno que tienen los métodos de ALT es que son comunes (o deberían serlo) a todos los sistemas operativos para PC con entorno gráfico: los he probado en la totalidad de los Windows y varios derivados de UNIX y, con sus particularidades, funcionan siempre y de manera parecida.

- ALT + tabulador. Imprescindible: con ella iremos cambiando de programas sin necesidad de estar pulsando con el ratón en la barra de tareas. En Windows, algo similar --aunque a mi juicio más incómodo-- se consigue con Windows + tabulador y la tecla ENTER.NOTA: El tabulador es la tecla que está a la izquierda de la 'Q'.

- ALT + F4. Cierra la ventana (finaliza el programa) actualmente activa. Si no hay ninguna en esta situación o todos los programas han sido cerrados, muestra el menú de apagado/reinicio del sistema

[Métodos más avanzados]

- ALT + barra espaciadora. Esta combinación accede al menú de manejo de la ventana activa: maximizar, restaurar, minimizar, mover y cambiar su tamaño. Esta última acción es quizá la menos sencilla de realizar con el teclado, pero es muy útil en esos casos en los que una ventana es tan enorme (eso lo suelen hacer las webs mamonas anteriormente mencionadas) que no podemos moverla ni modificar sus dimensiones: tras pulsar Alt + Barra y seleccionar "tamaño", tendremos que seleccionar una de las 8 direcciones posibles con los cursores (valen también combinaciones como "arriba-derecha"). El cursor se trasladará al borde escogido de la ventana y podremos modificar su tamaño. Una vez establecido a nuestro gusto, una pulsación de ENTER nos devolverá el control normal del programa.- ALT a secas. Pulsar la tecla de modo individual nos dará control sobre la barra de menúes del programa (la que suele contener los "Archivo", "Edición", "Ayuda", etc). Con ayuda de las teclas de cursor podremos movernos por dichos menúes con facilidad, seleccionando con ENTER. Uno o dos toques de ESC nos permitirán salir de esta situación.- ALT + letra subrayada. Si echamos un vistazo a muchos de los títulos de menúes, botones y demás, observaremos que tienen subrayada una de sus letras. ¿Esto para que sirve? Ni más ni menos que para acceder de forma directa a dichas funciones: pulsad ALT más cualquier letra subrayada que veáis y podréis comprobarlo. NOTA: Según como tengamos configurado Windows, puede que las letras subrayadas de la barra de menúes no aparezcan hasta que pulsemos ALT a secas.- ALT + ENTER. Si tenemos seleccionado un archivo en el Explorador, este atajo hace aparecer sus propiedades. Y como curiosidad, en el Windows Media Player esta misma combinación nos permite intercambiar

entre el modo normal y el modo de pantalla completa.

La tecla Control

Aparte de las combinaciones que ya conoce o debería conocer todo el mundo...

- CONTROL + X: Cortar- CONTROL + C: Copiar- CONTROL + V: Pegar

- CONTROL + Z: Deshacer (undo)- CONTROL + Y: Rehacer, aunque en algunos programas es MAYUS + CONTROL + Z.- CONTROL + P: Imprimir.- CONTROL + S: Guardar archivo.- CONTROL + O: Abrir archivo.- CONTROL + F: Buscar texto, aunque algún soplagaitas ha "traducido" ese atajo en algunos programas como el Bloc de Notas, conviertiéndose en CONTROL + B en las versiones en castellano.- CONTROL + A / CONTROL + E: Seleccionar todo. Otra de las absurdas consecuencias del fenómeno anterior: como en los programas traducidos abrir un archivo es CONTROL+A y, normalmente, es la combinación asignada a "seleccionar todo", en estos casos esta última se cambia a CONTROL + E. Un lío, vamos.

Aparte, cada programa tiene sus propias combinaciones, mereciendo la pena aprenderse las que usemos más frecuentemente. En los más potentes, se pueden personalizar y/o asociar a "macros" que automaticen tareas complejas y repetitivas.

El tabulador y la barra espaciodora

En cuadros de diálogo, alertas, menúes y similares, la tecla ENTER equivale al botón Aceptar/OK, mientras que ESC se corresponde con Cancelar/Cancel. ¿Cómo pulsar otros botones con el teclado? Se puede hacer de dos maneras: bien con ALT más su letra subrayada, bien seleccionándolo y pulsando la barra espaciadora. La barra también sirve para activar casillitas cuadradas (las que contienen una pequeña 'V').

Y se me olvidaba: para moverse por los distintos apartados de un menú o cuadro de diálogo, hay que usar el tabulador, que nos permitirá trasladarnos generalmente de arriba a abajo y de izquierda a derecha. Para moverse en el sentido contrario, bastará con usar MAYUS más el mismo tabulador.

¿Y si queremos cambiar de pestañas, en el caso de existir? Podemos hacerlo con CONTROL + Tabulador (sentido normal) o MAYUS + CONTROL +

Tabulador (sentido inverso). Un buen lugar para ensayar todo esto es el menú de propiedades de pantalla (Inicio | Configuración | Panel de Control | Pantalla).

La combinación CONTROL + Tabulador (o su inversa con MAYUS) también nos permitirá cambiar entre ventanas, en esos programas que las contienen en su interior, como Microsoft Word, Abobe Photoshop o el navegador Opera (llamados técnicamente MDI, Multiple Document Interface). De hecho, es la función equivalente a ALT + tabulador, pero con ventanas internas. Y de la misma manera, CONTROL + F4 cerrará cada una de estas subventanas.

Las teclas de Función (F-)

Desde la aparición de los entornos gráficos, su utilidad ha quedado reducida a un segundo plano: aún muchos recordamos esas plantillas de papel con la chuleta que contenía las funciones del WordPerfect para MS-DOS.

Pese a todo, aún tienen algunas tareas útiles. Aparte de las particulares de cada aplicación (imprescindible el F12 en el navegador Opera, por ejemplo) y de las que ya hemos visto de F10 y F4, tenemos tres reseñables:

- F1. Con ella accederemos a la ayuda correspondiente al programa activo.- F2. Con un archivo seleccionado, nos permitirá cambiarle el nombre. Esto funciona tanto en el Explorador de Windows como en algún otro programa (el Nero, por ejemplo).- F3. Accedemos a la búsqueda de archivos. La ventaja que tiene sobre la combinación Windows + F es que, si previamente nos hemos trasladado a una determinada carpeta con el Explorador de Windows, pulsar F3 nos permitirá restringir la búsqueda a esa carpeta y a sus subcarpetas (Windows + F busca de forma predeterminada en todos los discos duros locales).

Casi como anécdotas (por su escasa utilidad), se puede apuntar que F5 es equivalente a "actualizar" y que F10 (a secas) "enfoca" la barra de menúes, de la misma manera que la tecla ALT.

 

 

Estos atajos de teclado funcionan bajo Windows, estos atajos de teclado son útiles cuando solo cuentas con un teclado y no tienes un mouse a la mano.

Atajos de Teclado básicos

CTRL + C (Copiar) CTRL + X (Cortar) CTRL + V (Pegar) CTRL + Z (Deshacer) SUPR (Eliminar) MAYÚS + SUPR (Eliminar el elemento seleccionado

permanentemente sin enviarlo a la Papelera de reciclaje) CTRL mientras arrastra un elemento (Copiar el elemento

seleccionado) CTRL + MAYÚS mientras arrastra un elemento (Crear un acceso

directo al elemento seleccionado) Tecla F2 (Cambie el nombre del elemento seleccionado) CTRL + FLECHA DERECHA (Mover el punto de inserción al

principio de la siguiente palabra) CTRL + FLECHA IZQUIERDA (Mover el punto de inserción al

principio de la palabra anterior) CTRL + FLECHA ABAJO (Mover el punto de inserción al

principio del párrafo siguiente) CTRL + FLECHA ARRIBA (Mover el punto de inserción al

principio del párrafo anterior) CTRL + MAYÚS con cualquiera de las teclas de dirección (Resaltar

un bloque de texto) MAYÚS con cualquiera de las teclas de dirección (Seleccionar más

de un artículo en una ventana o en el escritorio, o seleccionar texto en un documento)

CTRL + A (Seleccionar todos) Tecla F3 (Buscar un archivo o una carpeta) ALT + ENTER (Ver las propiedades del elemento seleccionado) ALT + F4 (Cerrar el elemento activo, o salir del programa activo) ALT + ENTER (Mostrar las propiedades del objeto seleccionado) ALT + BARRA ESPACIADORA (Abrir el menú de la ventana

activa) CTRL + F4 (Cierra el documento activo en programas que le

permiten tener varios documentos abiertos simultáneamente) ALT + TAB (Cambiar entre los temas abiertos) ALT + ESC (Ciclo de los artículos que en el orden en que se había

abierto) Tecla F6 (ciclo a través de los elementos de la pantalla en una

ventana o en el escritorio) Tecla F4 (Mostrar lista de la barra de direcciones en Mi PC o el

Explorador de Windows) MAYÚS + F10 (Mostrar el menú contextual del elemento

seleccionado) ALT + BARRA ESPACIADORA (Mostrar el menú Sistema de la

ventana activa) CTRL + ESC (Mostrar el menú Inicio) ALT + letra subrayada en un nombre de menú (Mostrar el menú

correspondiente)

Letra subrayada en el nombre de un comando en un menú abierto (Realizar el comando correspondiente)

Tecla F10 (Activar la barra de menús en el programa activo) FLECHA DERECHA (Abra el siguiente menú a la derecha, o abrir

un submenú) Flecha izquierda (Abra el siguiente menú a la izquierda, o cerrar un

submenú) Tecla F5 (Actualizar la ventana activa) Tecla Retroceso (Ver la carpeta un nivel en Mi PC o el Explorador

de Windows) ESC (Cancelar la tarea actual) MAYÚS al insertar un CD-ROM en la unidad de CD-ROM

(Impedir la unidad de CD-ROM de forma automática la reproducción)

Atajos de teclado para Cuadros de diálogo

CTRL + TAB (Avanzar a través de las pestañas) CTRL + SHIFT + TAB (Mover hacia atrás a través de las pestañas) TAB (Avanzar por las opciones) SHIFT + TAB (Mover hacia atrás por las opciones) ALT + letra subrayada (Realizar el comando correspondiente o

seleccionar la opción correspondiente) ENTER (Realizar el comando de la opción activa o botón) BARRA ESPACIADORA (Seleccione o desactive la casilla de

verificación si la opción activa es una casilla de verificación) Teclas de dirección (Seleccionar un botón si la opción activa es un

grupo de botones de opción) Tecla F1 (Mostrar Ayuda) Tecla F4 (Mostrar los elementos de la lista activa) Tecla Retroceso (Abrir una carpeta de un nivel si una carpeta se

selecciona Guardar como en el cuadro de diálogo Abrir)

Atajos de teclado para funciones Windows Microsoft

Logotipo de Windows (Mostrar u ocultar el menú Inicio) Logotipo de Windows + INTER (Mostrar el cuadro de diálogo

Propiedades del sistema) Logotipo de Windows + D (Mostrar el escritorio) Logotipo de Windows + M (Minimiza todas las ventanas) Windows Logo+SHIFT+M (Restore the minimized windows)

Logotipo de Windows + MAYÚS + M (Restaurar las ventanas minimizadas)

Logotipo de Windows + E (Abre Mi PC) Logotipo de Windows + F (Buscar un archivo o una carpeta) Logotipo de Windows + Ctrl + F (Buscar equipos) Logotipo de Windows + F1 (Mostrar la Ayuda de Windows) Logotipo de Windows + L (Bloquear el teclado) Logotipo de Windows + R (Abre el cuadro de diálogo Ejecutar)

Logotipo de Windows + U (Abre el Administrador de utilidades)

Atajos de teclado de accesibilidad

SHIFT derecho durante ocho segundos (Switch FilterKeys encendido o apagado)

ALT + SHIFT + IMPR PANT (Switch de alto contraste encendido o apagado)

ALT + SHIFT + BLOQ NUM (Switch MouseKeys el encendido o apagado)

MAYÚS cinco veces (Switch StickyKeys el encendido o apagado) BLOQ NUM cinco segundos (Switch ToggleKeys el encendido o

apagado) Logotipo de Windows + U (Abre el Administrador de utilidades)

Atajos de teclado para   el Explorador de Windows

FIN (Mostrar la parte inferior de la ventana activa) INICIO (Mostrar la parte superior de la ventana activa) BLOQ NUM + signo asterisco (*) (Mostrar todas las subcarpetas

que están en la carpeta seleccionada) BLOQ NUM + Signo más (+) (Mostrar el contenido de la carpeta

seleccionada) BLOQ NUM + signo menos (-) (Contraer la carpeta seleccionada) FLECHA IZQUIERDA (Contraer la selección actual si es ampliado,

o seleccionar la carpeta principal) FLECHA DERECHA (Mostrar la selección actual si está colapsado,

o seleccionar la primera subcarpeta),

Teclas de acceso directo para Mapa de caracteres

Después de hacer doble clic en un personaje de la parrilla de salida de caracteres, puede mover a través de la red mediante el uso de los métodos abreviados de teclado:

FLECHA DERECHA (Mover a la derecha o hacia el comienzo de la siguiente línea)

FLECHA IZQUIERDA (Mover a la izquierda o hacia el final de la línea anterior)

FLECHA ARRIBA (Subir una fila) FLECHA ABAJO (Mover hacia abajo una fila) PÁGINA ARRIBA (Mover hacia arriba una pantalla a la vez) PÁGINA ABAJO (Mover hacia abajo una pantalla a la vez) INICIO (Mover al principio de la línea) FIN (Mover al final de la línea) CTRL + INICIO (Ir al primer carácter) CTRL + FIN (Ir al último carácter) BARRA ESPACIADORA (Cambiar entre ampliada y tampoco mal

modo cuando un personaje se ha seleccionado)

Atajos de teclado sobre la Ventana principal (Microsoft Management Console (MMC))

CTRL + O (Abre una consola guardada) CTRL + N (Abre una nueva consola) CTRL + S (Guardar la consola abierta) CTRL + M (Agregar o quitar un tema de consola) CTRL + W (Abre una nueva ventana) Tecla F5 (Actualizar el contenido de todas las ventanas de consola) ALT + BARRA ESPACIADORA (Mostrar el menú de la ventana

MMC) ALT + F4 (Cerrar la consola) ALT + A (Mostrar el menú Acción) ALT + V (Mostrar el menú Ver) ALT + F (Mostrar el menú Archivo) ALT + O (Mostrar el menú Favoritos)

Atajos de teclado para la ventana de la consola MMC

CTRL + P (Imprimir la página actual o el panel activo) ALT + signo menos (-) (Mostrar el menú de la ventana de la ventana

de la consola activa) MAYÚS + F10 (Mostrar el menú Acción para el elemento

seleccionado) Tecla F1 (Abra el tema de Ayuda, en su caso, para el elemento

seleccionado) Tecla F5 (Actualizar el contenido de todas las ventanas de consola) CTRL + F10 (Maximizar la ventana de la consola activa) CTRL + F5 (Restaurar la ventana de la consola activa) ALT + ENTER (Muestra el cuadro de diálogo Propiedades, en su

caso, para el elemento seleccionado) Tecla F2 (Cambie el nombre del elemento seleccionado) CTRL + F4 (Cerrar la ventana de la consola activa. Cuando una

consola sólo tiene una ventana de consola, este acceso directo se cierra la consola)

Navegación para Conexión a Escritorio remoto

CTRL + ALT + FIN (Abrir el cuadro de diálogo de seguridad de microsoft Windows NT)

ALT + AV PÁG (Cambiar entre programas de izquierda a derecha) ALT + PAGINA ABAJO (Switch entre programas de derecha a

izquierda) ALT + INSERT (ciclo a través de los programas utilizados más

recientemente, en fin) ALT + INICIO (Mostrar el menú Inicio) CTRL + ALT + INTER (Cambiar el equipo cliente entre una

ventana y una pantalla completa)

ALT + SUPR (Mostrar el menú de Windows) CTRL + ALT + signo menos (-) (Colocar una instantánea de la

ventana activa en el cliente de Terminal Server en el portapapeles y proporcionar la misma funcionalidad que presionar IMPR PANT en un equipo local.)

CTRL + ALT + Signo más (+) (Colocar una instantánea de toda la zona de la ventana del cliente de Terminal Server en el portapapeles y proporcionar la misma funcionalidad que pulsando ALT + IMPR PANT en un equipo local.)

Navegación de Internet Explorer

CTRL + B (Abra el cuadro de diálogo Organizar Favoritos) CTRL + E (Abrir la barra de búsqueda) CTRL + F (Iniciar la utilidad Buscar) CTRL + H (Abrir la barra Historial) CTRL + I (Abrir la barra Favoritos), CTRL + L (Abrir el cuadro de diálogo Abrir) CTRL + N (otro ejemplo de inicio del navegador con la misma

dirección Web) CTRL + O (Abrir el cuadro de diálogo Abrir, al igual que CTRL +

L) CTRL + P (Abre el cuadro de diálogo Imprimir) CTRL + R (Actualizar la página Web actual) CTRL + W (Cerrar la ventana actual)

Manual C# Sharp

ásico » Intermedio » Avanzado

¿Qué es C#? Lenguaje Orientado a Objetos Objeto Herencia

o Clase Funciones Miembro Campos Estáticos

o Clase Base o Clase Derivada o Clase Abstracta o Clase Sealed o Overloading/Sobrecarga

o Herencia Simple o Polimorfismo y Funciones Virtuales o Encapsulación y Visibilidad o Abstracción

Plataforma .NET .NET Common Language Runtime - CLR

o Características del CLR .NET Runtime Environment

o Ambiente/Entorno de Ejecución o Ensamblaje o Interoperabilidad de Lenguaje o Atributos

Biblioteca de Clases de la Plataforma .NET Requerimientos de Software Lenguaje Intermedio y Metadatos JIT Sistema de Tipo Unificado El Sistema Virtual de Objetos - VOS

o VOS Type System o Metadata y Reflection o Seguridad o Deployment o Interoperabilidad con código no administrado o Common Language Specification - CLS o Virtual Execution System - VES

Tipos de Datos o Constantes y Campos Solo Lectura

Ejemplo Hello World! Ejemplo Args Ejemplo Input/Output Ejemplo String Format Función Main

o Múltiples Funciones Main Preprocesamiento Comentarios Value Types

o Tipos simples Integral Bool Char Floating Point Decimal

o Tipos Estructura o Tipos Enumeración

Tipos Referencia o Tipo Objeto o Tipo Clase o Interfaces o Delegados

o Tipo string o Arreglos

Arreglos Multidimensionales Arreglo de Arreglos Arreglos de Objetos Conversión de Arreglos

o Clase Array o Interface IComparable o Interface IComparer

IComparer Como Propiedad Expresiones Regulares Operador as Secuencias de Escape Boxing

o Conversiones Boxing o Conversiones Unboxing

Constructores y Destructores o Constructor Estático

Métodos o Parámetros

Valores en Parámetros in Valores en Parámetros ref Valores en Parámetros out Ejemplo de Parámetros In, Ref y Out

Redefinición de Métodos (Overriding) Ocultamiento de Métodos (Hiding) Propiedades

o Accessors o Propiedades Estáticas

Índices Eventos Modificadores

o Modificadores de Clase o Modificadores Miembro o Modificadores de Acceso

public protected private internal

Sentencias de Control o Sentencias de Selección

Sentencia if Sentencia switch

o Sentencias de Iteración (repetición) Sentencia for Sentencia foreach Sentencia while Sentencia do

o Sentencias de Salto break

continue goto return

o Asignación Definitiva Precedencia de Operadores

o typeof o is

Conversiones

Básico » Intermedio » Avanzado

Manejo de Excepciones o Jerarquía de Excepciones o Trabajar con Excepciones o Chequeo de Overflow o Chequeo programático de Overflow o Sentencias para el Manejo de Excepciones

try - catch try - finally try - catch - finally

o Lanzamiento de Excepciones o Relanzamiento de Excepciones o Creación de Clases Exception

Componentes o Creación de Componentes

Compilación de Componentes o Creación de una Aplicación Cliente

Compilación de Clientes Namespaces

o Envolver Clases en Namespace o Utilizar Namespace en Aplicaciones Cliente o Agregar Múltiples Clases a Un Namespace o Namespace y Ensambles

Compilación Condicional o Uso del Preprocesador

Definición de símbolos Exclusión de código basado en símbolos Lanzamiento de errores y advertencias

o Atributo conditional Comentarios de Documentación en XML

o Elementos XML Componentes .NET

o Componentes .NET Privados o Componentes .NET Compartidos

Interoperabilidad COM o Uso de Componentes .NET en Componentes .COM o Uso de Componentes COM en Componentes .NET

Invocación de Servicios Código No Seguro Debugging

Seguridad o Seguridad de acceso al código

Permisos Estándar Permisos Identidad

o Seguridad basada en roles Función ToString() Función Equals()

Básico » Intermedio » Avanzado

Clase Hashtable o Interface IHashCodeProvider

Función ICloneable Formato Numérico

o Formato Personalizado String o Formato Estándar String

Parseo Numérico Input/Output Lectura y Escritura de Archivos Serialización Threading (Hilos)

¿Qué es C#?

C# o C Sharp es un lenguaje de programación que está incluido en la Plataforma .NET y corre en el Lenguaje Común en Tiempo de Ejecución (CLR, Common Language Runtime). El primer lenguaje en importancia para el CLR es C#, mucho de lo que soporta la Plataforma .NET está escrito en C#.

C# intenta ser el lenguaje base para escribir aplicaciones .NET

C# deriva de C y C++, es moderno, simple y enteramente orientado a objetos, simplifica y moderniza a C++ en las áreas de clases, namespaces, sobrecarga de métodos y manejo de excepciones. Se elimino la complejidad de C++ para hacerlo más fácil de utilizar y menos propenso a errores.

Algunas características de C# son:

C# provee el beneficio de un ambiente elegante y unificado. No soporta herencia múltiple, solamente el runtime .NET permite la herencia

múltiple en la forma de interfaces, las cuales no pueden contener implementación.

No maneja apuntadores, para emular la función de los apuntadores se utiliza delegates el cual provee las bases para el .NET event model.

Por default trabaja con código administrado. La Plataforma .NET provee un colector de basura que es responsable de

administrar la memoria en los programas C#. El manejo de errores está basado en excepciones. Soporta los conceptos como encapsulación, herencia y polimorfismo de la

programación orientada a objetos.

El Modelo completo de clases está construido en la cima del .NET Virtual Object System (VOS). El modelo de objetos es parte de la infraestructura y ya no forma parte del lenguaje de progrmación.

No existen funciones globales, variables o constantes. Todo deber ser encapsulado dentro de la clase, como un miembro de la instancia (accesible via una instancia de clase) o un miembro estático (via el tipo).

Los métodos que se definen en las clases son por default no virtuales (no pueden ser sobre escritos al derivar clases)

Soporta los modificadores de acceso private, protected, public y agrega un cuarto modificador internal.

Solamente se permite una base clase, si se requiere herencia múltiple es posible implementar intefaces.

No es posible utilizar variables no inicializadas. No es posible hacer el cast de un entero a un tipo de referencia (objeto). Los parámetros que son pasados son type-safe. El soporte de versiones lo provee el CLR. Permite acceder a diferentes APIs a través de .NET Common Language

Specification, el cual define el estádar de interoperabilidad entre lenguajes que se adhieran a este estándar.

La Plataforma .NET provee un acceso transparente a COM. Soporta OLE Permite la interoperabilidad con APIs al estilo C y DLLs, esta característica para

acceder a APIs nativas es llamada Platform Invocation Services (PInvoke) Por default el código es safe mode, pero es posible declarar clases o sólo

métodos unsafe, esta declaración permite utilizar apuntadores, estructuras y almacenamiento de arreglos estáticos.

C# depende del runtime que provee la Plataforma .NET, el runtime administra la ejecución de código.

Lenguaje Orientado a Objetos

Según Bjarne Stroustrup autor del lenguaje de programación C++, para que un lenguaje sea llamado Orientado a Objetos debe soportar tres conceptos: objetos, clases y herencia.

Aunque los lenguajes orientados a objetos se construyen sobre los conceptos de :

1. Encapsulación 2. Herencia 3. Polimorfismo

Objeto

Un Objeto es una instancia de un tipo de clase.

La instanciación es el acto de crear una instancia de un objeto, la instancia es un objeto, la instanciación usa el operador new, después la instanciación es posible comunicarnos con el objeto a través de sus miembros.

Un Objeto es una colección de información relacionada y funcional.

Un objeto se compone de:

Datos que describen el objeto y Operaciones que pueden ser realizadas por el objeto

Herencia

La Herencia es la habilidad para heredar datos y funcionalidad de un objeto padre, la herencia es una característica fundamental de un sistema orientado a objetos.

A través de la herencia es posible crear o derivar una nueva clase basada en una clase existente.

Una clase derivada es la nueva clase que esta siendo creada y la clase base es una de las cuales la nueva clase es derivada. La nueva clase derivada hereda todos los miembros de la clase base por consiguiente permite reusar el trabajo previo.

En C# se puede asumir que la clase derivada podría heredar todos los miembros de la clase base.

La herencia es un ejemplo del diseño orientado a objetos conocido como una relación "is-a" (es-un), por ejemplo:

"un empleado es una persona".

Al utilizar la herencia la clase base necesita ser diseñada teniendo en mente la herencia, si los objetos no tienen la estructura apropiada la herencia no podría funcionar correctamente.

Una clase derivada no debería requerir más ni prometer menos que su clase base sobre cualquiera de sus interfaces heredadas.

Una interfaz de clase es un contrato entre esta y los programadores que usan la clase.

upcasting, cuando un programador tiene una referencia a la clase derivada, el programador siempre puede tratar a esa clase como si fuera la clase base.

En el lenguaje común en tiempo de ejecución .NET todos los objetos heredan de la última clase base llamada object y existe sólo una herencia simple de objetos.

Un objeto puede derivar sólo de una clase base.

Clase

Una Clase es una plantilla para un objeto.

Una Clase define las operaciones que un objeto puede realizar y define un valor que mantiene el estado del objeto, los componentes principales de una clase son: métodos, eventos y propiedades.

Una instancia de una clase es un objeto, se accede a la funcionalidad de un objeto invocando sus métodos y accediendo a sus propiedades, eventos y campos.

Una clase utiliza modificadores para especificar la accesibilidad de la clase y sus componentes, los componentes de una clase son llamados miembros por lo que existen diferentes tipos de miembros. Una referencia se refiere a una instancia, una instancia es la creación de un objeto del tipo clase que se está declarando. Una clase utiliza ninguno, uno o más constructores para ayudar a definir la instancia de una clase. Existe una palabra reservada llamada this que sirve para hacer referencia a la clase actual en el ámbito en el cual es utilizada. Cuando se hace referencia a una variable de instancia que tiene el mismo nombre de un parámetro se debe utilizar this.name.

Al crear y manipular objetos no es necesario administrar la memoria que estos ocupan ya que existe un mecanismo que se encarga de esto llamado garbage collector (recolector de basura), pero es una buena práctica no olvidar liberar los recursos.

Funciones Miembro

Una Función Miembro puede ser un constructor, es decir, una pieza de código que es invocada en una instancia del objeto.

Campos Estáticos

Un Miembro Estático definine miembros de un objeto que no son asociados con una instancia de clase específica.

Un Campo Estático es el tipo más simple de un miembro estático, para declarar un campo estático se utiliza el modificador static.

Un campo estático puede accederse a través del nombre de la clase, en vez de la instancia de la clase (objeto):

using System;class MiContador{

//Campo Estáticopublic static int iContador = 0;public MiContador(){

iContador++;}

}class App{

public static void Main(){MiContador ContadorA = new MiContador();Console.WriteLine(MiContador.iContador);MiContador ContadorB = new MiContador();Console.WriteLine(MiContador.iContador);

}}

El ejemplo determina cuantas instancias del objeto han sido creadas.

Clase Base

Una Clase base es un objeto padre de donde se basa un nuevo trabajo.

Clase Derivada

Una Clase derivada es un objeto hijo.

Clase Abstracta

Una Clase Abstracta define las funciones que una clase derivada debe implementar.

Una Clase Abstracta define un contrato en donde las clases derivadas deben definir las funciones que la clase padre marca utilizando la palabra reservada abstract, además que la clase padre también se define como abstract.

using System;abstract public class Persona{//Indica que la clase es

abstracta//Propiedadespublic string sNombre;public int iEdad;//Constructorpublic Persona(string sNombre, int iEdad){

this.sNombre = sNombre;this.iEdad = iEdad;

}//Métodosabstract public string Tipo();//Método que la clase

derivada debe implementar}//Herencia Simplepublic class Empleado : Persona{

public Empleado(string sNombre, int iEdad):base(sNombre, iEdad){}

override public string Tipo(){return "Empleado";

}}

class App{//Aplicación

public static void Main(){Console.WriteLine("--- Arreglo de Objetos ---");

Empleado[] aProgramadores = new Empleado[2];aProgramadores[0] = new Empleado("Bill Gates", 50);aProgramadores[1] = new Empleado("Eric S. Raymond",

60);for(int i = 0; i < aProgramadores.Length; i++){ Console.WriteLine("aProgramadores["+i+"].sNombre : "

+ aProgramadores[i].sNombre); Console.WriteLine("aProgramadores[" + i + "].iEdad :

" + aProgramadores[i].iEdad); Console.WriteLine("aProgramadores[" + i + "].Tipo :

" + aProgramadores[i].Tipo());}

}}

Clase Sealed

Una Clase sealed se utiliza para prevenir que una clase sea utilizada como una clase base, su principal uso es para prevenir la derivación no planeada.

sealed class ClaseBase{ClaseBase(){}

}class ClaseDerivada : ClaseBase{}class Sellada{

public static void Main(){ClaseDerivada CD = new ClaseDerivada();

}}

Al compilar el código se muestra el siguiente mensaje:

sealed.cs(4,7): error CS0509: 'ClaseDerivada' : cannot inherit from sealed class 'ClaseBase'

sealed.cs(1,14): (Location of symbol related to previous error)

El error es porque ClaseDerivada no puede utilizar ClaseBase como una clase base porque ClaseBase es sealed, es decir, no permite derivaciones.

Overloading/Sobrecarga

La Sobrecarga (Overloading) hace posible utilizar dos o más clases con el mismo nombre, pero con parámetros diferentes. La sobrecarga es común especialmente para los constructores para definir diferentes maneras de crear una instancia nueva.

Cuando una función sobrecargada es invocada el compilador selecciona la función apropiada que coincide con los parámetros.

Herencia Simple

La Herencia Simple permite derivar una clase en una clase nueva, que contiene la definición de la clase de la cual deriva, es decir, hereda todos los miembros datos de la clase, aunque pueden existir miembros a los cuales no se pueda tener acceso por ser private.

Los constructores no pueden ser heredados, por lo que es necesario escribir constructores y si funcionalmente no existe alguna modificación se invoca el constructor de la clase que hereda utilizando la sintaxis base. Si se omite el constructor de la clase base y es invocado el compilador podría invocar el constructor de la clase base sin parámetros.

using System;

public class Persona{//Propiedadespublic string sNombre;public int iEdad;private double dSueldo;//Constructorpublic Persona(string sNombre, int iEdad){

this.sNombre = sNombre;this.iEdad = iEdad;

}//Métodospublic string Tipo(){

return "Persona";}public void AsignarSueldo(double dSueldo){

this.dSueldo = dSueldo;}public double ObtenerSueldo(){

return this.dSueldo;}

}//Herencia Simplepublic class Empleado : Persona{

public Empleado(string sNombre, int iEdad):base(sNombre, iEdad){}

public new string Tipo(){return "Empleado";

}double dSueldo;public new void AsignarSueldo(double dSueldo){

this.dSueldo = dSueldo * dSueldo;}public new double ObtenerSueldo(){

return this.dSueldo;}

}

class App{//Aplicaciónpublic static void Main(){

Persona Mexicano = new Persona("Gerado Ángeles Nava", 33);

Console.WriteLine("Mexicano.sNombre : " + Mexicano.sNombre);

Console.WriteLine("Mexicano.iEdad : " + Mexicano.iEdad);

double dSueldo = 123.456;Mexicano.AsignarSueldo(dSueldo);Console.WriteLine("Mexicano.iSueldo : " +

Mexicano.ObtenerSueldo());Console.WriteLine("Mexicano.Tipo : " +

Mexicano.Tipo());

Console.WriteLine("--- Herencia Simple ---");

Empleado Programador = new Empleado("Carlos Salinas G.", 53);

Console.WriteLine("Programador.sNombre : " + Programador.sNombre);

Console.WriteLine("Programador.iEdad : " + Programador.iEdad);

Programador.AsignarSueldo(dSueldo);Console.WriteLine("Programador.iSueldo : " +

Programador.ObtenerSueldo());Console.WriteLine("Programador.Tipo : " +

Programador.Tipo());}

}

Polimorfismo y Funciones Virtuales

El polimorfismo es la funcionalidad que permite a código antiguo invocar código nuevo, también permite extender el sistema sin modificar el código existente, esto se logra sobreescribiendo o redefiniendo el código, para lo cual se utilizan funciones virtuales y la palabra clave override.

Las funciones abstractas son automaticamente funciones virtuales, las cuales permiten al programador usar polimorfismo para hacer su código simple.

Virtual significa que cuando una invocación a funciones miembro, el compilador debería buscar por el tipo real del objeto y no por el tipo de la referencia, e invocar en base al tipo la función apropiada.

using System;public class Persona{

//Propiedadespublic string sNombre;public int iEdad;//Constructorpublic Persona(string sNombre, int iEdad){

this.sNombre = sNombre;this.iEdad = iEdad;

}//Métodosvirtual public string Tipo(){

return "Persona";}

}//Herencia Simplepublic class Empleado : Persona{

public Empleado(string sNombre, int iEdad):base(sNombre, iEdad){}

override public string Tipo(){return "Empleado";

}}

class App{//Aplicación

public static void Main(){Persona Mexicano = new Persona("Gerado Ángeles Nava",

33);Console.WriteLine("Mexicano.sNombre : " +

Mexicano.sNombre);Console.WriteLine("Mexicano.iEdad : " +

Mexicano.iEdad);Console.WriteLine("Mexicano.Tipo : " +

Mexicano.Tipo());

Console.WriteLine("--- Arreglo de Objetos ---");

Empleado[] aProgramadores = new Empleado[2];aProgramadores[0] = new Empleado("Bill Gates", 50);aProgramadores[1] = new Empleado("Eric S. Raymond",

60);for(int i = 0; i < aProgramadores.Length; i++){ Console.WriteLine("aProgramadores["+i+"].sNombre : "

+ aProgramadores[i].sNombre); Console.WriteLine("aProgramadores[" + i + "].iEdad :

" + aProgramadores[i].iEdad); Console.WriteLine("aProgramadores[" + i + "].Tipo :

" + aProgramadores[i].Tipo());}

}}

Cuando una función es declarada con la palabra reservada override significa que es la misma función que fue declarada en la clase base, si la palabra reservada override se omite el compilador podría asumir que la función no está relacionada a la función de la clase base y no despacha la función virtual (el compilador podría sugerir omitir override o agregar new) .

Cuando existe una función virtual el programador puede pasar una referencia a la clase abstracta aunque la clase derivada y el compilador podrían escribir código para invocar la versión apropiada de la función en tiempo de ejecución.

Por ejemplo, el objeto base object tiene una función virtual llamada ToString() que convierte un objeto a string. Si se invoca la función ToString() en un objeto que que no la tiene como versión propia, la versión de la función que es parte de la clase object podría ser invocada.

Encapsulación y Visibilidad

Encapsulación (también llamada information hiding), habilidad de un objeto para ocultar sus datos internos o parte interna de sus usuarios y provee una interface que hace las partes importantes del objeto accesible programaticamente.

La encapsulación provee los límites entre una interfaz externa y los detalles de su implementación interna.

Al diseñar objetos el programador decide que objetos son visibles al usuario y que es privado dentro del objeto, los detalles que no son visibles al usuario son señalados para ser encapsulados en la clase.

Razones para encapsular y ocultar:

El usuario no puede cambiar lo que es privado en el objeto, lo cual reduce la oportunidad de que el usuario cambie o dependa de los detalles en el código, si el usuario hace lode detalles dependientes, los cambios realizados en el objeto quizá arruinen el código del usuario.

Los cambios realizados en partes públicas de un objeto deben permanecer compatibles con la versión previa. Las partes públicas pueden ser cambiadas sin arruinar el código del usuario.

Los campos privados pueden sólo ser accesados desde la clase, los campos públicos pueden ser accesados a través de cualquier instancia de la clase.

Abstracción

Una Abstracción se refiere a como un problema dado es representado en el espacio de programa.

Como desarrollador de clases es necesario pensar en terminos de hacer el mejor diseño de abstracción para los clientes de clase y permitirles enfocarse a la tarea que deben realizar y no escudriñar o indagar en los detalles de como funciona la clase, también es necesario determinar cuales de los miembros de la clase deberían ser accesibles publicamente.

Los beneficios de una buena abstracción, es diseñarla de manera tal que las modificaciones son minimas, si se conoce bien el problema a resolver facilita determinar que métodos necesitara el usuario, también será un sistema fácil de entender y mantener.

La interfaz de clase es la implementación de la abstracción.

Plataforma .NET

La solución Microsoft .NET comprende cuatro componentes fundamentales:

1. Servicios de Bloques de Construcción .NET o acceso programático para ciertos servicios tales como almacenamiento de archivos, calendario y pasaporte .NET el cual es un servicio de verificación de identidad.

2. Dispositivos de Software .NET el cual podría correr sobre nuevos dispositivos Internet.

3. La Experiencia de Usuario .NET la cual incluye características tales como interfaz natural, agentes de información y etiquetas inteligentes es decir una tecnología que automatiza hiperligas para información relacionada a palabras y frases en documentos creados por el usuario.

4. La Infraestructura .NET la cual comprende la plataforma .NET, Microsoft Studio .NET, los Servidores Corporativos .NET y Microsoft Windows .NET

La Infraestructura .NET se refiere a todas las tecnologías que constituyen el nuevo ambiente para crear y ejecutar aplicaciones robustas, escalables y distribuidas. La parte de .NET que permite desarrollar estas aplicaciones es la plataforma .NET.

La Plataforma .NET consiste de un Lenguaje Común en Tiempo de Ejecución (CLR) y la Biblioteca de Clases de la Plataforma .NET algunas veces llamada la Biblioteca de Clases Base (CBL).

El CLR es como una máquina virtual (el código que corre dentro del CLR en ejecución en un ambiente encapsulado y controlado, separados de otros procesos en la máquina)

en la cual funcionan las aplicaciones .NET, todos los lenguajes .NET tienen la biblioteca de clases de la Plataforma .NET a su disposición.

La biblioteca de clases de la Plataforma .NET incluyen soporte para cualquiera de los archivos de entrada/salida y base de datos de entrada/salida para XML y SOAP.

La Plataforma .NET es una plataforma nueva que simplifica la aplicación del desarrollo en ambientes altamente distribuidos de Internet. La Plataforma .NET está diseñada para cumplir los siguientes objetivos:

Proveer un ambiente consistente de programación orientada a objetos, tanto o si el código objeto es almacenado y ejecutado localmente, o si es ejecutado localmente pero distribuido en Internet o si es ejecutado remotamente.

Proveer un ambiente de ejecución de código que minimice la distribución de software y conflictos de versiones.

Proveer un ambiente de ejecución de código que garantice la ejecución de código seguro, incluyendo el código creado por un desconocido o un tercero semiconfiable.

Proveer un ambiente de ejecución de código que elimine los problemas de desempeño de ambientes de scripts o interpretes.

Hacer que la experiencia del desarrollador sea consistente a través de una amplia variedad de aplicaciones, tal como aplicaciones basadas en Windows y aplicaciones basadas en Web.

Construir toda la comunicación sobre estándares industriales para asegurar que el código basado en la Plataforma .NET pueda integrarse con cualquier otro código.

La Plataforma .NET consiste de dos componentes principales:

1. El Lenguaje Común en Tiempo de Ejecución (CLR) el cual es el fundamento de la Plataforma .NET

2. La Biblioteca de Clases de la Plataforma .NET, es una colección orientada a objetos de tipos reusables que pueden utilizarse para desarrollar aplicaciones en el rango de aplicaciones tradicionales desde la línea de comandos o interfaces de usuario gráficas (GUI) hasta aplicaciones basadas en las últimas inovaciones que provee ASP.NET tales como Web Forms y servicios web XML.

El runtime es una agente que administra el código en tiempo de ejecución al proveer de serviciones principales como la administración de memoria, administración de hilos, también implementa tipos estrictos de seguridad y otras formas de verificación de código que aseguren la seguridad y robustez.

El concepto de administración de código es principio fundamental del runtime. El código que manipulará el runtime es conocido como código administrado, mientras que el código que no será manipulado por el runtime es conocido como un código no administrado.

La plataforma .NET puede almacenar componentes no administrados que son cargados por el CLR en sus procesos e inicializados por la ejecución de código administrado de

esta manera se crea un ambiente de software que puede explotar tanto caracterísitcas de código administrado como las del código no administrado.

.NET Common Language Runtime - CLR

El .NET Common Language Runtime (Lenguage común en tiempo de ejecución .NET) es un ambiente basado en componentes y C# esta diseñado para facilitar la creación de componentes. Todos los objetos son escritos como componentes y los componentes son el centro de acción, por ello que reciba el nombre de lenguaje céntrico de componentes (component-centric).

Los componentes creados en C# son totalmente auto-describibles y pueden ser utilizados sin un proceso de registro.

C# ayuda en la creación de componentes mediante el runtime y framework .NET, los cuales proveen un sistema de tipo unificado en el cual todo puede ser tratado como un objeto.

Características del CLR

EL CLR no sólo soporta el compilador de C#, también el de Visual Basic y C++, el código que generan estos compiladores para ser soportado por CLR es llamado managed code.

Algunos de los beneficios que las aplicaciones obtienen del CLR son:

Integración de lenguajes a través del Common Language Specification Administración automatica de memoria, a través del recolector de basura. Manejo de excepciones de lenguajes. Seguridad type safety. Soporte de versiones. Modelo Simplificado para la interacción de componentes.

El CLR provee los beneficios anteriores, el compilador debe emitir los metadatos en el managed code. Los metadatos describen los tipos en el código y son empaquetados en el código ejecutable.

El CLR administra la memoria, ejecución de hilos, ejecución de código, verificación de código seguro, compilación y otros servicios. Estas características son intrínsecas a la administración de código que corre sobre el CLR.

La seguridad y administración de componentes depende de un número de factores que se incluyen en su origen como Internet red corporativa, computadora local, es decir, quizá o quizá no están disponibles para desempeñar operaciones de acceso a archivos, acceso a registros o funciones sensitivas, aún si comienzan a utilizarse en el misma aplicación activa.

El runtime forza el acceso a código seguro, no es posible acceder a datos personales, sistema de archivos o red.

El runtime también forza la robustez del código implementando una infraestrucutra estricta de verificación de código llamado Common Type System (CTS), el cual asegura que toda la administración de código se describe así misma. La variedad de compiladores Microsoft y de terceros genera código administrado que conforma el CTS, es decir, que la administración de código puede consumir otros tipos e instancias administradas, mientras que se forza estrictamente la fidelidad de tipo y seguridad de tipo.

La administración del ambiente del runtime elimina cuestiones de software comunes, liberando por ejemplo recursos que ya no son utilizados.

El runtime también acelera la productividad del desarrollador, no importa el lenguaje que un programador utilice, puede utilizar las ventajas del runtime, biblioteca de clases, y componentes escritos por otros programadores, cualquier compilador que utilice el runtime puede hacer lo mismo,

La interoperabilidad entre código administrado y no administrado permiten a los desarrolladores continuar utilizando componentes COM y DLLs.

El runtime está diseñado para incrementar el desempeño, através del CLR que provee muchos servicios estándar, el código administrado nunca es interpretado, una característica llamada just-in-time (JIT) permite compilar todo el código administrado para correr en el lenguaje nativo de la máquina del sistema o de cualquiera que se este ejecutando. El administrador de memoria elimina las posibilidades de fragmentación de memoria e incrementa la referencia de localidad de memoria para impulsar el incremento del desempeño.

El runtime soporta aplicaciones del lado del servidor como Microsoft® SQL Server™ e Internet Information Services (IIS), esta infraestructura permite utilizar codigo administrado para escribir la lógica del negocio.

.NET Runtime Environment

El Lenguaje Común en Tiempo de Ejecución provee los servicios de ejecución básica. Las clases base proveen tipos de datos básicos, clases colección y otras clases generales. Las clases base son clases para tratar datos y XML. En la parte superior de la arquitectura las clases exponen servicios web y tratramiento de la intefaz de usuario. Una aplicación puede hacer invocaciones en cualquier nivel y utilizar clases desde cualquier nivel.

Organización .NET Framework:

Servicios Web Interfaz de Usuario

Datos y XML

Clases Base

 

Lenguaje Común en Tiempo de Ejecución

Ambiente/Entorno de Ejecución

El ambiente o entorno provee un modelo de programación simple, seguro, soporta de herramientas potentes y ayuda con la distribución, empaquetado y soporte:

Modelo de Programación Simple, todos los servicios son ofrecidos a través de un modelo común que puede ser accedido desde cualquier lenguaje .NET y los servicios pueden ser escritos en cualquier lenguaje .NET, el entorno o ambiente en gran parte es un lenguaje agnóstico permitiendo la elección de lenguaje, esto hace el código fácil de reusar para el programador y los proveedores de bibliotecas.

En el runtime .NET todos los errores son reportados via excepciones.

El entorno contiene las Bibliotecas de Clase Base (Base Class Libraries - BCL) las cuales proveen las funciones tradicionales fundadas en bibliotecas en tiempo de ejecución, la funcionalidad del BCL incluye:

o Clases colección, tales como consultas, arreglos, pilas y tablas hash.o Clases de acceso a bases de datoso Clases IO (input-output)o Clases WinForms, para crear interfaces de usuarioo Clases Network

Fuera de la clase base en tiempo de ejecución, existen muchos otros componentes que controlan la interfaz de usuario (UI) y realizan otras operaciones sofisticadas.

Seguridad, el entorno del runtime .NET está diseñado para ser un entorno seguro. El runtime .NET es un entorno administrado o controlado, lo cual significa que el runtime administra la memoria por el programador a través del recolector de basura.

El runtime .NET es un entorno verificado, en tiempo de ejecución el entorno verifica que la ejecución del código sea de tipo segura (type-safe).

El sistema de seguridad interactua con el verificador para asegurar que el código realice sólo lo que tiene permitido hacer, esto es posible especificando un requerimiento de seguridad para una pieza de código específica.

Soporte de herramientas potentes, Microsoft suministra cuatro lenguajes .NET: VB, VC++, C# y JScript. La depuración en gran medida es enriquecida por el runtime .NET, el modelo de ejecución común hace la depuración de lenguajes simple y directa.

Distribución, empaquetado y soporte, El runtime .NET ayuda simplificando la distribución y en algunos casos no existe el paso tradicional de instalación, porque los paquetes son distribuidos en un formato genérico, un paquete puede correr en cualquier entorno que soporte .NET, el entorno separa los componentes de una aplicación por lo que una aplicación sólo corre con los componentes que son enviados.

Ensamblaje

En el runtime .NET el mecanismo de empaquetado es el ensamble (assembly), cuando el código es compilado por uno de los compiladores .NET, es convertido a una forma intermedia conocida como IL.

El ensamble contiene todos los IL, metadatos y otros archivos requeridos para que un paquete se ejecute en un paquete completo.

Cada ensamble contiene un manifiesto que enumera todos los archivos que están contenidos en el ensamble, controla que tipos y recursos son expuestos fuera del ensamble y relaciona las referencias de esos tipos y recursos a los archivos que contienen los tipos y recursos.

El manifiesto también lista otros ensambles que dependen de un ensamble.

Los ensambles se contienen a sí mismo, existe suficiente información en el ensamble para ser auto-descrito.

Cuando se define un ensamble, el ensamble puede ser contenido en un solo archivo o puede ser dividido entre varios archivos. Utilizando varios archivos podría hacer posible un escenario donde las secciones del ensamble sean descargadas sólo como se necesiten.

Interoperabilidad de Lenguaje

Una de las metas del runtime .NET es ser un lenguaje agnóstico, permitiendo que el código sea utilizado y escrito desde cualquier lenguaje, no sólo las clases pueden ser escritas en algún lenguaje .NET como VB.NET y ser invocadas desde otro lenguaje .NET como C#, una clase que fué escrita en VB.NET puede ser utilizada como una clase base escrita en C# y esa clase podría ser utilizada desde una clase VC++ o JScript, es decir, no importaria en que clase sea escrita una clase.

Para hacer lo anterior posible existen algunos obstaculos como las propias características del lenguaje, ya que un lenguaje no podría soportar ciertas cosas que otro si las soporte, por ejemplo la sobrecarga de operadores.

Para que una clase sea utilizada desde un lenguaje .NET, la clase debe adherir la Especificación Común de Lenguaje (Common Language Specification - CLS) la cual describe que características pueden ser visibles en la interfaz pública de la clase, por ejemplo el CLS prohibe exponer tipos de datos sin signo, porque no todos los lenguajes pueden utilizarlos.

Atributos

El runtime .NET soporta atributos personalizables, los cuales son en cierto sentido un lugar para colocar información descriptiva en los metadatos junto con un objeto y entonces recuper después los datos. Los atributos proveen un mecanismo general para hacer esto y son utilizados en exceso en todo el tiempo de ejecución para almacenar información que modifica como el runtime utiliza las clases.

Los atributos son extensibles y permite a los programadores definir atributos y utilizarlos.

Los atributos se especifican encerrandolos entre corchetes:

[Version("14/09/2005", Comentario="1.0.1.0")]

Los atributos son anotaciones que se colocan en elementos de código fuente, como clases, miembros, parámetros, etc.

Los atributos puede ser utilizados para: cambiar el comportamiento del runtime, proveer información acerca de un objeto, llevar información organizacional al diseñador.

El atributo información es almacenado con los metadatos del elemento y pueden ser facilmente recuperados en tiempo de ejecución a través de un proceso conocido como reflection.

C# utiliza un Atributo Condicional para controlar cuando las funciones miembro son invocadas.

Por convención los atributos se agregan al final del nombre de una clase, con la finalidad de conocer cuales son clases atributo y cuales son clases normales. Todos los atributos derivan de System.Attribute.

Procure que el atributo para el elemento sea específico, utilizando los identificadores siguientes:

Identificador Descripción

assembly ensamble

module módulo

type clase o estructura

method método

property porpiedad

event evento

field campo

param parámetro

return valor de regreso

Los atributos que son aplicados a ensambles o módulos deben colocarse después de cualquier cláusula using y antes de cualquier código.

Biblioteca de Clases de la Plataforma .NET

La Biblioteca de Clases de la Plataforma .NET es una colección de tipos reutilizables integradas en el CLR.

Los tipos de la Plataforma .NET permiten llevar a cabo tareas de programación comunes como manipulación de strings, colecciones de datos, conectividad a bases de datos y acceso a archivos.

Es posible utilizar la Plataforma .NET para desarrollar los siguientes tipos de aplicaciones y servicios:

Aplicaciones de consola Windows Forms Aplicaciones ASP.NET Servicios Web XML Servicios Windows

Requerimientos de Software

Todo lo que se necesita para desarrollar en C# es el Kit de desarrollo (SDK), del cual solo se utilizará el CLR y el compilador de C#.

Lenguaje Intermedio y Metadatos

Microsoft desarrollo un lenguaje parecido al lenguaje ensamblador llamado Microsoft Intermediate Language (MSIL).

Para compilar aplicaciones .NET, los compiladores toman el código fuente como entrada y producen MSIL como salida.

MSIL en sí es un lenguaje completo con el cual es posible escribir aplicaciones.

El managed code generado por el compilador C# no es código nativo porque es un código de Lenguaje Intermedio (IL). Este código IL se convierte en la entrada para la administración del proceso de ejecución del CLR. La ventaja final del código IL es que el CPU es independiente, lo cual significa que se necesita un compilador en la máquina destino para cambiar el código IL en el código nativo.

El IL es generado por el compilador, pero no es lo único que se provee para el runtime, el compilador también genera metadatos acerca del código, los cuales dicen más al runtime del código, por ejemplo la definición de cada tipo. Los metadatos son bibliotecas de tipo, entrada de datos al registry, etc. Los metadatos son empaquetados directamente con el código ejecutable y no en localidades separadas.

El IL y los metadatos son colocados en los archivos que extienden el formato PE (Portable Executable) utilizado para archivos .exe y .dll, cuando se carga el archivo PE el runtime coloca y extrae los metadatos y el IL de estos.

Cuando se compila una aplicación C# o cualquier aplicación escrita en un CLS, la aplicación es compilada dentro del MSIL, además se compila dentro de las instrucciones nativas de CPU cuando la aplicación es ejecutada por vez primera por el CLR.

El proceso es el siguiente:

1. Código fuente escrito en C# 2. El código fuente es compilado usando el compilador de C# (csc.exe) dentro de

un EXE. 3. El compilador C# produce como salida el código MSIL y un manifiesto en una

parte de sólo lectura del EXE que tiene un encabezado estándar PE (Win32-Portable Executable).

Cuando el compilador produce o crea la salida también importa una función llamada _CorExeMain del runtime .NET.

4. Cuando la aplicación es ejecutada, el sistema operativo carga el PE como una DLL dependiente tal como la única que exporta la función _CorExeMain (mscoree.dll) justo como lo hace con cualquier PE válido.

5. El sistema operativo carga y entonces salta al punto dentro del PE el cual es puesto ahí por el compilador C#.

El sistema operativo obviamente no puede ejecutar el código MSIL, el punto de entrada es un pequeña parte que salta a la función _CorExeMain en mscoree.dll.

6. La función _CorExeMain comienza la ejecución del código MSIL que fue colocado en el PE.

7. Dado que el código MSIL no puede ser ejecutado directamente (porque no está un un formato de máquina ejecutable) el CLR compila el MSIL usando un compilador just-in-time (JIT o JITter) dentro de instrucciones CPU nativas tal como procesa el MSIL.

JITers

El managed code generado por C# es el código IL, aunque el código IL es empaquetado en un formato de archivo PE válido, no es posible ejecutarlo sin convertirlo a un managed code nativo.

Cuando un tipo es cargado, el laoder crea y agrega un stub (pieza pequeña) a cada método del tipo, así cuando el método es invocado por vez primera, el stub pasa el control al JIT.

El JIT compila el IL a código nativo y cambia el stub para que apunte al código nativo que está en cache, así las subsecuentes invocaciones podrían ejecutar el código nativo.

El CLR incluye tres diferentes JITers que pueden ser usados para convertir MSIL en código nativo, dependiendo de las circunstancias:

1. PreJIT (Generación de código Install-time), opera como un compilador tradicional, aunque está basado sobre el compilador JIT principal, se ejecuta cuando un componente NGWS es intalado y compila el código IL a managed code nativo.

La generación de código en tiempo de instalación compilará un ensamble completo dentro de un código binario de CPU-especifico, tal como lo hace el compilador C++. Un ensamble el código empaquetado que es enviado al

compilador. La compilación se hace en tiempo de instalación, cuando el usuario final es menos probable para notificar que el ensamble esta siendo compilado-JIT.

La ventaja de la generación de código en tiempo de instalación, es que permite compilar el ensamble completo justo una vez antes de ser ejecutado. Al ser compilado el ensamble entero no hay preocupación referente al desempeño intermitente cada vez que un método en el código es ejecutado por primera vez.

Al usar esta utilidad depende del tamaño del sistema y del ambiente de distribución.

2. JIT, compilador por default utilizado por el CLR, es un compilador optimizado, el cual realiza el análisis del flujo de datos, administra el código nativo como salida.

El JITter es invocado en tiempo de ejecución.

3. EconoJIT, realiza una conversión muy veloz del IL a managed code nativo

También es un JITter en tiempo de ejecución, esta especialmente diseñado para sistemas que tienen recursos limitados como memoria. La principal diferencia con un JIIter regular es la incorporación de algunas invocaciones code pitching, que permiten al EconoJIT descartar el código generado o compilado si el sistema comienza a ejecutarse fuera de memoria, siendo el beneficio el reclamo de memoria. La desventaja es que si el código es pitched (lanzado) es invocado otra vez por lo que debe ser compilado de nuevo.

Es posible determinar que tipo de JIT esta siendo utilizado y cuanta memoria utiliza a través de una pequeña utilidad llamada JIT Compiler Manager (jitman.exe), que reside en el directorio bin del directorio de instalación del NGWS SDK.

Sistema de Tipo Unificado

El runtime de .NET hace más que dar al desarrollador un simple sistema de tipo unificado que es usado a través de todos los lenguajes, también deja a los lenguajes escribir extensiones de sistema tipo, agregando nuevos tipos que parezcan y actuen como tipos de sistemas built.in.

El Sistema Virtual de Objetos - VOS

Las reglas que se siguen cuando se declaran, utilizan y administran tipos son modeladas en el Sistema Virtual de Objetos (Virtual Object System - VOS).

El VOS establece una plataforma que permite la integración de lenguajes y type safety.

La base de la arquitectura del runtime es la plataforma que puede describir en cuatro áreas:

1. VOS Type System , provee un sistema de tipos que intenta soportar la implementación completa de una rango amplio de lenguajes de programación.

2. Metadata , describe y hace referencia a los tipos definidos por el VOS.3. Common Language Specification - CLS , define el subconjunto de tipos del

VOS. Si una biblioteca de clases es soportada por las reglas del CLS, garantiza que la biblioteca de clases pueda ser utilizada por los demás lenguajes que implementen el CLS.

4. Virtual Execution System - VES , es responsable de la carga y ejecución de los programas que fueron escritos por el CLR.

VOS Type System

El VOS define tipos que describen valores y especifican un contrato en donde todos los valores de tipo deben soportar. Existen dos entidades: valores y objetos.

Para un valor el tipo describe la representación de almacenamiento y las operaciones que puede realizar.

Los objetos son más poderosos porque el tipo es almacenado explicitamente en su representación, cada objeto tiene una identidad que lo distingue de los demás objetos.

Metadata

El compilador CLS toma el código fuente como entrada y produce código MSIL para el runtime para compilar a través de los JITters y ejecutar. Además se mapea el código fuente a secuencias de instrucciones MSIL, el compilador CLS tiene otra tarea importante: envolver metadatos dentro del EXE resultante.

Los Metadatos son datos que describen datos.

Los metadatos son la colección de elementos programáticos que constituyen el EXE, como los tipos declarados y los métodos implementados.

Estos metadatos son similares a los tipos de bibliotecas generadas con componentes COM (Component Object Model).

La razón para usar metadatos es simple ya que permiten al runtime .NET conocer en tiempo de ejecución que tipos podrían ser almacenados y que métodos podrían ser invocados. Esto permite al runtime configurar apropiadamente el ambiente para mayor eficiencia al ejecutar la aplicación. El significado por el cual estos metadatos son consultados es llamado reflection.

Los metadatos por cada objeto .NET registran toda la información que es requerida para usar el objeto, con esta información el runtime .NET es capaz de resolver como crear objetos, invocar funciones miembro o acceder a los datos de un objeto y el compilador puede utilizar la información para encontrar que objetos están disponibles y como es utilizado un objeto. La información incluye lo siguiente:

El nombre del objeto Los nombres de todos los campos del objeto y sus tipos

Los nombres de todas las funciones miembro, incluyendo tipos parámetro y nombres

Los metadatos también permiten a otras herramientas acceder a la información detallada acerca del código

Existe un proceso llamado reflection donde el código en tiempo de ejecución puede consultar los metadatos para encontrar que objetos están disponibles y que funciones y campos están presentes en la clase. La reflection está disponible para usuarios finales para determinar como son los objetos, búsqueda de atributos o ejecutar métodos en los que los nombres no son conocidos hasta el tiempo de ejecución.

Los metadatos son utilizados para varias tareas:

Para representar la información que el CLR utiliza para localizar y cargar clases. Para sacar las instancias de las clases en memoria. Para resolver la invocación de métodos. Para traducir IL a código nativo. Para forzar la seguridad.

El encargado de generar los metadatos es el compilador C#, al pasar el código a IL, emitiendo la información binaria de los metadatos en un archivo PE.

La principal ventaja de la combinación de los metadatos con el código ejecutable es que la información acerca de los tipos es persistente.

Una herramienta que toma ventaja de reflection es el ILDASM (Microsoft .NET Framework IL Disassembler), el cual analiza la aplicación de metadatos fuente y entonces presenta información acerca de la aplicación en la jerarquía del árbol.

Seguridad

La faceta más importante de cualquier ambiente de desarrollo de aplicaciones distribuidas es como manejar la seguridad.

La seguridad comienza tan pronto como una clase es caragada por el CLR porque la clase loader es parte del esquema de seguridad .NET, la seguridad relacionada a factores tales como reglas de accesibilidad y requerimientos de consistencia son verificados.

Deployment

La llave para el Deployment de aplicaciones .NET es el concepto de (ensambles). Los assemblies son paquetes simples de comportamiento semanticamente relacionados que son construidos como un archivo individual o entidades de archivos múltiples.

La especificación de como deploy una aplicación podría variar ya que se puede tratar de un desarrollo web o aplicación tradicional de escritorio.

El runtime .NET mantiene el rastreo delos archivos y de las versiones de los archivos asociados con una aplicación. Cualquier aplicación que es instalada es automáticamente asociada con los archivos que son parte de ese ensamble.

Si una aplicación de instalación intenta sobre escribir un archivo necesario para otra aplicación, el runtime .NET es lo bastante inteligente para permitir que la aplicación de instalación, instale los archivos necesarios pero el CLR no elimina las versiones previas de el archivo porque todavía son requeridas por la primer aplicación.

Interoperabilidad con código no administrado

El código no administrado no tiene las ventajas que tiene el código administrado, como recolección de basura, sistema de tipo unificado y metadatos.

Código administrado invocando funciones DLL no administradas, cuando la aplicación necesita una interfaz para una DLL en C y la empresa que escribe la DLL no adopta .NET será necesario invocar esa DLL desde una aplicación .NET.

Código administrado usando componentes COM, es posible lograr esto creando un wrapper .NET para el componente COM, así que el cliente administrado trabaja con clases .NET

Código no administrado usando servicios .NET, cuando se desea acceder a .NET desde código no administrado.

Common Language Specification - CLS

Es un conjunto de reglas que un lenguaje debe adherir para crear aplicaciones .NET que se ejecutan en el CLR.

Un concepto importante relacionado a la CLR es el código administrado, el código administrado es justo el código que esta ejecutandose bajo el auspicio de la CLR y por consiguiente comienza a ser controlado por el CLR.

El CLS define un subconjunto de tipos del VOS, si una biblioteca de clases sigue las reglas del CLS esta garantizando ser utilizada por clientes de otro lenguaje de programación que también se adhieren a la CLS.

El CLS se refiere a la interoperabilidad entre lenguajes, por lo que es necesario seguir los tipos y características del CLS, para ello es necesario conocer los tipos primitivos, arreglos, tipos, miembros tipo, métodos, campos, propiedades, enumeraciones, excepciones, interfaces, eventos, atributos personalizables, delegados, identificadores, etc. que la propia especicicación define.

Virtual Execution System - VES

El Sistema Virtual de Ejecución implementa la VOS y se crea implementando un motor de ejecución (Execution Engine EE). Los componentes de la VES son:

Lenguaje Intermedio (Intermediate Language - IL), diseñado para ser facilmente traducido a una amplia gama de lenguajes, por lo que el compilador C# es capaz de generar el lenguaje intermedio.

Carga del Código Administrado (Loading Managed Code), resuelve nombres, obtiene clases de la memoria, crea stubs que son necesarios para la compilación JIT. La class loader forza la seguridad.

Conversión de IL a Código Nativo via JIT, el código del lenguaje intermedio no esta diseñado como un interprete tradicional bytecode o árbol de código, la conversión del lenguaje intermedio es realmente una compilación.

Carga de Metadatos, se encarga de checar la seguridad de tipos y la integridad de los métodos.

Recolector de Basura y Manejo de Excepciones (Garbage Collection), el codigo administrado premite rastrear el apilado en el runtime, para que el runtime entienda el apilado individual de frames un código administrado tiene que ser proporcionado por el JITer o por el compilador.

Servicios de debugging, estos servicios dependeran de la información producida por el compilador del lenguaje fuente y se emiten dos mapas, un mapa del lenguaje fuente de la construcción de direcciones en el flujo de instrucciones y un mapa de las direcciones de las localidades en el apilado de frames.

Administración de Hilos, el VES proprorciona este servicio al código administrado.

Tipos de Datos

C# soporta el conjunto de tipos de datos usual, para cada tipo de dato que C# soporta, existe una correspondencia tipo de lenguaje común en tiempo de ejecución .NET subyacente.

Todos los tipos runtime pueden encontrarse en el namespace System del lenguaje común en tiempo de ejecución .NET.

Tipo Bytes Tipo runtime Descripción

byte 1 Byte Unsigned byte

sbyte 1 SByte Signed byte

short 2 Int16 Signed short

ushort 2 UInt16 Unsigned short

int 4 Int32 Signed integer

uint 4 UInt32 Unsigned int

long 8 Int64 Signed big integer

ulong 8 UInt64 Unsigned big integer

float 4 Single Floating point number

double 8 double Double-precision floating point number

decimal 8 Decimal Fixed-precision number

string   String Unicode string

char   Char Unicode character

bool   Boolean Boolean value

Los tipos de datos son separados en value types y reference types. Los value types son asignados en estructuras de pilas o en línea. Los reference types son asignados al aglomerado.

Las referencias y tipos de valores son derivados de la última clase base objet, de esta manera en caso de que un tipo de valor necesite actuar como un object una envoltura hace que el tipo de valor parezca una referencia asignandolo al aglomerado, y los tipos de valores son copiados a estos. La envoltura es marcada por lo que el sistema conoce que contiene por ejemplo int, a este proceso se le conoce como boxing y el proceso de reversa se le conoce como unboxing

La palabra reservada class es empleada para declarar un tipo referencia (heap allocated), y la palabra reservada struct es empleada para declarar un tipo valor, una estructura es utilizada para objetos ligeros que necesitan actuar como tipos built-in, las clases son utilizadas en cualquier otro caso.

Por ejemplo un tipo int es un valor tipo y un tipo string es un tipo referencias, esto trabajaria así:

int i = 2005;string s = "Septiembre";

i 2005    

s o----------------->

Septiembre

Constantes y Campos Solo Lectura

En C# los valores pueden ser definidos como constantes y para que un valor sea constante su valor debe ser algo que pueda ser escrito como una constante.

public const string sDominio = "informatique.com.mx";

La restricción de tipos constantes es que son conocibles en tiempo de compilación, en vez de ello es posible utilizar el modificador readonly el cual está diseñado para aquellas situaciones en donde las constantes tienen restricción.

Aplicando el modificador readonly un valor puede ser establecido en el constructor o en una inicialización pero no puede ser modificado después.

Ejemplo Hello World!

El código C# puede ser escrito en cualquier editor, también puede escribirse con Visual Studio 7.

El código C# debe almacenarse en un archivo con extensión .cs

Para compilar el código C# es necesario tener instalado la Plataforma .NET que incluye el compilador C#, puede buscar el ejecutable en la ruta:

C:WINDOWSMicrosoft.NETFrameworkv1.1.4322csc.exe

Asegurese de tener esta ruta en el path para poder ejecutar el compilador desde cualquier ubicación.

Para compilar su archivo .cs es necesario abrir la consola (DOS) y escribir el comando cs seguido del nombre de su archivo por ejemplo:

cd helloworld.cs

La salida exitosa de la compilación podría ser así:

Microsoft (R) Visual C# .NET Compiler version 7.10.6001.4for Microsoft (R) .NET Framework version 1.1.4322Copyright (C) Microsoft Corporation 2001-2002. All rights

reserved.

Si existe algún error el compilador lo notificará. El archivo es compilado y ligado a helloworld.exe, (el archivo .exe generado tendrá el nombre del archivo fuente) para ejecutar el programa sólo es necesario escribir el nombre del archivo ejecutable.

Algo interesante es que es posible especificar el nombre del archivo ejecutable a través de un switch:

csc /out:nuevoNombre.exe nombreArchivoFuente.cs

El siguiente es el ejemplo típico de los lenguajes de programación:

class HelloWorld{public static void Main(){

System.Console.WriteLine("Hello World");}

}

El método Main debe estar contenido en la clase y escrito con la primer letra en mayúscula. El tipo de este método puede ser void o int. También este método puede especificar argumentos:

public static void Main(string[] args)

System es el ámbito del namespace en el cual el objeto Console está contenido.

Es posible importar el namespace en las aplicaciones indicandolo al inicio del código con la palabra reservada using que es una directiva para el namespace System. Existen más namespaces en la Plataforma .NET

using System;

Ejemplo Args

Examinemos el siguiente ejemplo, el cual recibe los argumentos con los que el componente fue invocado:

Ejemplo de Args con for:

using System;class Args{

public static void Main(string[] args){Console.WriteLine("Argumentos : {0}",

args.Length);for(int itera = 0; itera < args.Length; itera+

+)Console.WriteLine("Argumento {0} : {1}",

itera, args[itera]);}

}

Ejemplo de Args con foreach:

using System;class App{

public static void Main(string[] args){foreach(string input in args){

Console.WriteLine(input);}

}}

using System;, define el namespace System, el cual contiene entre otras la clase Console la cual es utilizada para comunicarse con la línea de comandos.

using permite al usuario omitir el namespace al utilizar el tipo al que es referenciado en este caso System, por lo que en vez de escribir:

System.Console.WriteLine();

Solamente se escribe:

Console.WriteLine();

using no puede ser utilizado con un nombre de clase por lo que no es permitido escribir using System.Console

class Args, Al no existir las funciones globales en C#, se declara una clase llamada Args.

public static void Main(string[] args), La clase Args contiene una función o método Main(), el cual sirve como punto de partida de la ejecución del componente, este método puede o no ser declarado con argumentos, en este caso es fundamental declarlos porque deseamos precisamente leer y escribir estos argumentos proporcionados al invocar el componente.

Al ser un método de arranque debe ser declarado con el modificador static porque no está asociado con una instancia de un objeto.

El método indica que recibe un arreglo de tipo string llamado args

Console.WriteLine("Argumentos : {0}", args.Length);, invoca el método WriteLine de la clase Console para escribir en la línea de comando lo que se indica entre los paréntesis.

La primer parte de lo que se encierra entre paréntesis es un string donde es necesario destacar que{0}, es una notación que indica entre llaves un índice que hace referencia a una variable asociada a este, en este caso asociada con args.Length

args.Length, Length es un método de la clase args el cual obtiene el número de elementos que contiene este arreglo.

El ciclo for comienza una iteración desde 0 hasta el número de elementos que contiene el arreglo args.Length, por cada elemento contenido en el arreglo escribe en la línea de comandos lo que se indica en ("Argumento {0} : {1}", itera, args[itera]) que como mencionamos anteriormente {0} hace referencia al orden en que las variables serán escritas, en este caso corresponde al iterador y {1} corresponde a args[itera], lo cual indica obtener el elemento en cuestión del arreglo args.

Para compilar el componente utilice csc Args.cs Para ejecutar el componente sin parámetros escriba en la línea de comando: csc

Args

Salida : Argumentos : 0

Para ejecutar el componente con parámetros escriba en la línea de comando:

csc Args p1 p2 p3 p4 p5 p6 ... pn

Por ejemplo: args http : www . informatique . com . mx

Salida :

Argumentos : 8Argumento 0 : httpArgumento 1 : :Argumento 2 : wwwArgumento 3 : .Argumento 4 : informatiqueArgumento 5 : .Argumento 6 : comArgumento 7 : .Argumento 8 : mx

Ejemplo Input/Output

Es posible leer datos de la consola utilizando el método ReadLine y es posible mostrarlos utilizando el método Write o WriteLine del objeto Console:

using System;class inOut{

public static void Main(){Console.Write("Fecha de Nacimiento: ");String strFecNac = Console.ReadLine();Console.WriteLine("FecNac = " + strFecNac);

}}

Note que importar la directiva System hace posible omitir escribir el namespace, de esta forma sólo es necesario escribir el nombre del objeto seguido del nombre del método.

Ejemplo String Format

Es posible dar formato a la salida de datos a un tipo string, utilizando la sintaxis {número} donde número es reemplazado por la variable correspondiente:

using System;class strFormat{

public static void Main(){

Console.Write("Nombre: ");String strNombre = Console.ReadLine();

Console.Write("Edad: ");String strEdad = Console.ReadLine();

Console.Write("Teléfono: ");String strTel = Console.ReadLine();

Console.Write("Dirección: ");String strDir = Console.ReadLine();

Console.WriteLine("Datos: {0} {1} {2} {3}", strNombre

, intEdad, strTel, strDir);}

}

Función Main

Es posible incluir una función estática en la clase para poder probarla, en C# esta función estática puede ser escrita como Main() e indica el inicio de la ejecución de un programa:

using System;class App{

public static void Main(){Console.WriteLine("Hello world!");

}}

El ejemplo anterior define a la función Main como void lo cual indica que no regresa un valor, pero es posible indicar que si regrese un valor escribiendo el tipo de la función como int por ejemplo, que indica que regresa un valor de tipo entero:

using System;class App{

public static int Main(){Console.WriteLine("Hello world!");return(1);

}}

También es posible que la función Main reciba parámetros de la línea de comandos, para ello es necesario especificar un arreglo de strings como parámetro:

using System;class App{

public static void Main(string[] args){foreach(string input in args){

Console.WriteLine(input);}

}}

Múltiples Funciones Main

Es posible que existan en una aplicación varias clases que contengan la función Main() y por ello al compilar se indicará un error.

Para evitar el error o indicar que función Main() de que clase deseamos que se ejecute, es necesario utilizar el siguiente switch al compilar:

/main:nombreClase

Por ejemplo

using System;class ClaseA{

public static void Main(){Console.WriteLine("Main de la clase A");

}}class ClaseB{

public static void Main(){Console.WriteLine("Main de la clase B");

}}class ClaseC{

public static void Main(){Console.WriteLine("Main de la clase C");

}}

Al compilar utilice : csc multiplesmain.cs /main:ClaseB

Salida: Main de la clase B

Preprocesamiento

Lo más importante en este punto es que en C# no existe el preprocesador, el motivo por el cual no existe es para simplificar la estructura de compilación además de que no hay necesidad de escribir un archivo de encabezados por separado y mantener en sincronia la implementación, cuando los archivos fuente C# son compilados el orden de la compilación de archivos individuales no es importante y es equivalente a un archivo de gran tamaño.

Un identificador es el nombre que es usado para algún elemento de un programa como una variable o función y deben tener una letra o guión bajo como primer caracter.

C# soporta las siguientes directivas de preprocesamiento:

Tamaño Valor

#define Define un identificador, los identificadores también pueden ser definidos via la línea de comando

#undef Elimina la definición de un identificador

#if El código de la sección es compilado si la expresión es verdadera

#elifConstructor Else-if, si la directiva anterior no se cumplio y si la expresión es verdadera el código de la sección es compilado

#else Si la directiva anterior no se cumplio el código de la sección es compilado

#endif Marca el final de la sección

Los identificadores deben preceder a cualquier código real.

Es posible utilizar los siguientes operadores en expresiones preprocesador:

! == != && ||

Es posible utilizar paréntesis para agrupar expresiones.

Comentarios

Es posible comentar el código, para ello existen dos modalidades:

1. //, que se utiliza para comentar una línea, es decir, todo lo que sigue a // es ignorado.

2. /* */, que se utiliza para comentar segmentos de código.

Value Types

Una variable contiene un valor de cierto tipo, C# forza a inicializar las variables antes de utilizarlas en una operación.

Cuando se asigna un valor a un value type el valor actual es copiado a diferencia de los reference types lo que se copia es la referencia actual no el valor.

C# agrupa los value types en:

1. Tipos Simples 2. Tipos Estructura 3. Tipos Enumeración

Tipos Simples

Los Tipos Simples de C# comparten características como las de alias con los tipos de sistema de .NET, expresiones constantes consisten de Tipos Simples evaluados solamente en tiempo de compilación no en tiempo de ejecución y los Tipos Simples pueden ser inicializados con literales.

Los Tipos Simples de C# se agrupan en:

Integral

Representa valores enteros y existen nueve tipos integral en C#:

Tipo Tamaño Valor

sbyteEntero con signo

8 bit -128 a 127

byteEntero sin signo

8 bit 0 a 255

shortEntero con signo

16 bit -32,768 a 32,767

ushortEntero sin signo

16 bit 0 a 65,535

intEntero con signo

32 bit -2,147,483,648 a 2,147,483,647

uintEntero sin signo

32 bit 0 a 4,294,967,295

longEntero con signo

64 bit-9,223,372,036,854,775,808 a -9,223,372,036,854,775,807

ulongEntero sin signo

64 bit 0 a 18,446,744,073,709,551,615

Bool

Representa valores booleanos verdadero y falso, por lo que es posible asignar a una variable un valor booleano o el resultado de una expresión:

bool bContinuar = (a > b);

En C# el valor verdadero no es posible representarlo con algún valor diferente de cero, no hay una conversión entre el tipo integral a bool que force esta conversión.

Char

Representa un caracter Unicode de 16 bit de tamaño, por ejemplo:

char cSexo = 'M';

También es posible asignar un valor hexadecimal utilizando la secuencia de escape x o un valor Unicode con la secuencia de escape u:

char cHexadecimal = 'x0068';char cUnicode = 'u0068';

No existen conversiones implicitas de char a otro tipo de datos disponible, esto significa por ejemplo que tratar de convertir una variable char a un tipo de dato integral no es posible en C#, por lo que se tendrá que hacer un cast explicito:

char cCaracter = (char)65;int nNumero = (int)'A';

Floating Point

Representan dos tipos de datos, flotantes (float) y dobles (double):

Tipo Valor

float 1.5x10-45 a 3.4x1038 con una precisión de 7 dígitos

double 5.0x10-324 a 1.7x10308 con una precisión de 15-16 dígitos

Al realizar operaciones con Floating Point pueden producirse los siguientes valores:

o Cero positivo y negativoo Infinito positivo y negativoo NaN, Not-a-Number

Nota: Si una expresión un valor es de tipo Floating Point todos los otros valores son convertidos a tipos Floating Point antes de realizar el cálculo.

Decimal

Representa un tipo de alta precisión de 128 bit el cual es posible utilizarlo para calculos financieros y monetarios. Los valores posibles comprenden los rangos 1.0x10-28 a 7.9x1028 con una precisión de 28 a 29 dígitos.

No hay conversiones implicitas entre decimales y dobles, se podría generar un overflow o perder precisión, por lo que es necesario una conversión explícita con un cast.

Cuando se define una variable y se le asigna un valor se utiliza el sufijo m para denotar que es un valor decimal:

decimal decDecimal = 1.0m

Si se omite la letra m la variable podría ser tratada como double por el compilador antes de ser asignado.

Tipos Estructura

Un tipo struct puede declarar constructores, constantes, campos, métodos, propiedades, índices, operadores y tipos anidados. Las estructuras actuan de manera similar a una clase y con mayores restricciones, por ejemplo no pueden heredar de cualquier otro tipo, ni tampoco otra clase puede heredar de una estructura.

Las estructuras deberían ser utilizadas sólo para tipos que son realmente una pieza de datos.

La diferencia entre struct y class en C# es que struct es un value type y class es una reference type.

La principal idea de utilizar struct es para crear objetos ligeros como Point, FileInfo, etc., de esta manera se conserva memoria porque no hay referencias adicionales que son creadas como se necesiten por objetos clase.

using System;struct IP{

public byte b1,b2,b3,b4;}class ip{

public static void Main(){IP miIP;miIP.b1 = 192;miIP.b2 = 168;miIP.b3 = 1;miIP.b4 = 101;Console.Write("{0}.{1}.", miIP.b1,miIP.b2);Console.Write("{0}.{1}", miIP.b3,miIP.b4);

}}

Tipos Enumeración

Es posible establecer un conjunto de constantes relacionadas, por default los elementos de una enumeración son de tipo int donde el primer elemento tiene el valor 0 y cada elemento subsecuente se incrementa en 1. Es posible establecer el valor del primer elemento simplemente asignando a este el valor deseado, así como es posible especificar el tipo de dato de los valores contenidos especificandolo después del nombre de la enumeración aunque están restringidos a los tipos: long, int, short y byte.

Sintaxis:

enum NombreEnumeraciones{constante1,constante2,constante3,..constanteN

}

Ejemplo:

using System;public class Enumeracion {

enum enumDias {Sabado, Domingo, Lunes, Martes, Miércoles, Jueves, Viernes };

enum enumMeses {Enero,Febrero,Marzo,Abril,Mayo,Junio,Julio,Agosto,Septiembre,_

Octubre,Noviembre,Diciembre};enum enumFecha {Dia = 21, Mes = 9, Año = 1971};

public static void Main() { Type eDias = typeof(enumDias); Type eMeses = typeof(enumMeses);

Type eFecha = typeof(enumMeses);

Console.WriteLine("Los días de la semana, y su valor correspondiente en la enumeración es:");

foreach ( string s in Enum.GetNames(eDias) ) Console.WriteLine( "{0,-11}= {1}", s, Enum.Format( eDias, Enum.Parse(eDias, s), "d"));

Console.WriteLine(); Console.WriteLine("Los meses del año, y su valor correspondiente en la enumeración es:");

foreach ( string s in Enum.GetNames(eMeses) ) Console.WriteLine( "{0,-11}= {1}", s, Enum.Format(eMeses, Enum.Parse(eMeses, s), "d")); }

}

Tipos Base

Los Tipos Base para las enumeraciones se especifican listando el tipo base después del nombre de la enumeración:

enum eDias : int{Lunes,Martes,Miércoles,Jueves,Viernes

};

Los tipos base válidos para las enumeraciones son: byte, sbyte, short, ushort, int, uint, long y ulong.

Si el tipo base no es especificado, el tipo base por default es int.

Tipos Referencia

Es contraste a value types los reference types no almacenan el dato actual que representan, porque almacenan una referencia al dato actual.

Los reference types que C# utiliza son:

Tipo Objeto Tipo Clase Interfaces Delegados Tipo string Arreglos

Tipo Objeto

El Tipo Objeto es la Clase Base de todos los tipos, al ser la clase base de todos los tipos es posible asignarle valores de cualquier tipo.

El Tipo Objeto es utilizado cuando el value type esta boxed, es decir, que está disponible como un objeto.

Tipo Clase

El Tipo Clase contiene datos miembro, funciones miembro y tipos anidados. Los datos miembro son constantes, campos y eventos. Las funciones miembro incluyen métodos, propiedades, índices, operadores, constructores y destructores.

Interfaces

Una interface declara un tipo referencia que tiene sólo miembros abstractos. Sólo existe la firma pero no tiene implementado todo el código, por lo que no es posible instanciar una interface, sólo un objeto que deriva de la interface. Para crear una interface se emplea la palabra reservada interface:

using System;interface Iuno{

void AccionUno();}

class Implementa : Iuno{public void AccionUno(){

Console.WriteLine("Acción uno...");}

}

class App{public static void Main(){

Implementa I = new Implementa();I.AccionUno();

}}

Es posible definir métodos, propiedades e índices en una interface, cuando se define una Clase es posible derivar de múltiples interfaces, mientras que al definir una interface sólo es posible derivar de sólo una clase.

Las interfaces están estrechamente relacionadas a clases abstractas, se parecen a una clase abstracta que tiene todos sus miembros abstractos.

Cuando un objeto implementa una interface, una referencia a la interface puede ser obtenida por un cast de la interface.

Una clase puede implementar más de una interface.

class NombreClase : InterfaceA, InterfaceB{}

Existe una técnica llamada Implementación de la Interface Explícita y se utiliza para resolver colisiones con nombres de métodos iguales entre interfaces:

using System;interface Iuno{

void AccionUno();}interface Idos{

void AccionUno();}

class Implementa : Iuno, Idos{void Iuno.AccionUno(){

Console.WriteLine("Colisión resuelta con el nombre del método Iuno");

}void Idos.AccionUno(){

Console.WriteLine("Colisión resuelta con el nombre del método Idos");

}}

class App{public static void Main(){

Implementa I = new Implementa();Iuno uno = (Iuno) I;uno.AccionUno();Idos dos = (Idos) I;dos.AccionUno();

}}

Es posible ocultar al usuario de la clase la implementación de una interfaz, así como también es posible crear interfaces basadas de otras interfaces.

Delegados

Los delegados son similares a las interfaces, especifican un contratado entre un caller y un implementer (implementador).

Un delegado especifica la forma de una función en vez de especificar toda una interface.

Las interfaces se crean en tiempo de compilación y los delegados son creados en tiempo de ejecución.

Un delegado encapsula un método con cierta firma, básicamente un delegado es un type-safe y secure version. Un delegado es una implementación de function pointers orientada a objetos y son utilizados en muchas situaciones donde un componente necesita volver a invocar el componente que lo esta usando.

Es posible encapsular métodos estáticos e instancias en una instancia delegado.

El principal uso de los delegados es con los eventos no con las clases.

La especificación del delegado determina la forma de la función y crea una instancia del delegado, se usa la función que coincide con la forma.

Los delegados al ser de naturaleza dinámica se utilizan cuando el usuario desea cambiar el comportamiento, por ejemplo si deseamos que una clase Ordenamiento soporte diferentes métodos de ordenación, la ordenación podría ser controlada en base a un delegado que defina la función de comparación.

Nota los delegados siempre son creados aún si no son usados, pero los delegados podrían ser creados al vuelo si se reemplazan las funciones estáticas por propiedades, entonces unicamente se crea el delegado solo si se utiliza la propiedad.

Tipo string

El Tipo string se utiliza para manipular datos string. La clase string deriva directamente de object y no es posible derivarla.

Todos los strings en C# son instancias del tipo System.String en el CLR.

string es un alias para la clase predefinida System.String y su uso es muy sencillo:

string sWebSite = "http://www.informatique.com.mx";

Para acceder a un caracter, simplemente acceda a su índice:

sWebSite[11];

Es posible hacer un barrido de los caracteres que componen el string utilizando la propiedad Length que poseen los arreglos y porque es posible acceder a estos tratando al string como un arreglo:

using System;class App{ public static void Main(){

string sWebSite = "http://www.informatique.com.mx";Console.WriteLine("sWebSite contiene : " +

sWebSite.Length + " caracteres");for(int iElemento = 0; iElemento < sWebSite.Length;

iElemento++){Console.WriteLine("Elemento " + iElemento + " :

" + sWebSite[iElemento]);}

}}

Es posible concatenar strings utilizando el operador +.

Si requiere comparar strings por igualdad utilice el operador de comparación ==

Aunque string es un reference type la comparación se realiza comparando los valores no las referencias.

La clase String es un ejemplo de tipo inmutable, es decir, que los caracteres contenidos en el string no puede ser modificados por los usuarios del string, todas las operaciones que son realizadas por la clase String regresan una versión modificada del string en vez de modificar la instancia en la cual se invoco el método.

La clase String soporta los sisguientes métodos de comparación y búsqueda:

Método Descripción

Compare() Compara dos strings.

CompareOrdinal() Compara dos regiones de strings utilizando una comparación ordinal

CompareTo() Compara la instancia actual con otra instancia.

EndsWith() Determina cuando un substring existe al final de un string

StartsWith() Determina cuando un substring existe al principio de un string.

IndexOf() Regresa la posición de la primer ocurrencia de un substring

LastIndexOf() Regresa la posición de la última ocurrencia de un substring

Concat() Concatena dos o más strings u objetos, si se pasan objetos la función ToString es invocada

CopyTo() Copia un número específico de caracteres de una ubicación del string dentro del arreglo

Insert() Regresa un nuevo string con un substring insertado en la ubicación específica

Join() Une un arreglo de strings junto con un separador entre cada elemento del arreglo

PadLeft() Alinea a la izquierda un string

PadRight() Alinea a la derecha un string

Remove() Elimina caracteres de un string

Replace() Reemplaza todas las instancias de un caracter con caracteres diferentes

Split() Crea un arreglo de strings dividiendo un string en cualquier ocurrencia de uno o más caracteres

Substring() Extrae un substring de un string

ToLower() regresa una versión de un string en minúsculas

ToUpper() regresa una versión de un string en mayúsculas

Trim() Elimina espacios en blanco de un string

TrimEnd() Elimina un string de caracteres al final de un string

TrimStart() Elimina un string de caracteres al inicio de un string

object.ToString(), convierte un objeto a una representación string. String.Format() puede ser utilizada para crear un string basado en los valores de otro string.

La clase StringBuilder soporta las siguientes propiedades y métodos:

Propiedad Descripción

Capacity Recupera o establece el número de caracteres que StringBuilder puede contener

[] Índice StringBuilder utilizado para obtener o establecer un caracter en la posición específica

Length Recupera o establece la longitud

MaxCapacity Recupera la capacidad máxima del StringBuilder

Método Descripción

Append() Agrega la representación string de un objeto

AppendFormat() Agrega la representación string de un objeto, utilizando un formato específico para el objeto

EnsureCapacity() Asegura que StringBuilder tiene suficiente espacio para un número de caracteres específico

Insert() Inserta la representación string de un objeto específico en una posición específica

Remove() Elimina los caracteres específicos

Replace() Reemplaza todas las instancias de un caractes con un nuevo caracter

Arreglos

Un arreglo contiene variables a las cuales se accede a través de índices, todas las variables contenidas en el arreglo son referidos como elementos los cuales deben ser del mismo tipo, por lo que el tipo del arreglo.

Los arreglos en C# son referencias a objetos. Un arreglo value type no contiene instancias boxed.

El valor inicial de un arreglo es null, un arreglo de objetos es creado utilizando new.

Cuando un arreglo es creado inicialmente contiene los valores por default para los tipos que este contendrá.

Sintaxis:

tipo[] identificador;

Note que para definir un arreglo se utilizan los corchetes [] después del tipo del arreglo.

Ejemplo:

string[] aPersonas;

Es posible inicializar un arreglo al momento de crearlo:

string[] asPersonas = new string[] {"Tim Berners-Lee","Brendan Eich","Dennis Ritchie","James Gosling"};

Durante la inicialización es posible omitir new tipo[x] y el compilador podría determinar el tamaño de almacenamiento para el arreglo del número de items en la lista de inicialización:

string[] asPersonas = {"Tim Berners-Lee","Brendan Eich","Dennis Ritchie","James Gosling"};

Cada elemento de un arreglo de ints es un int con el valor 0:

int[] aiNumeros = new int[5];

Cada elemento de un arreglo de strings es un string con el valor null:

string[] asNombres = new string[5];

La dimensión del arreglo puede ser simple o multidimensional, donde cada dimensión comienza con el índice 0, si requiere hacer un barrido de todos los elementos del arreglo, comience a partir del índice 0 hasta la longitud del arreglo menos uno (nombreArreglo.Length - 1 o nIndice < nombreArreglo.Length);

using System;class Arreglo{

static public void Main(){

string[] aNombres = {"Hugo","Paco","Luis"};Console.WriteLine(aNombres[0]);Console.WriteLine(aNombres[1]);Console.WriteLine(aNombres[2]);

}}

Otra alternativa al ejemplo anterior es:

int[] aiNumeros = new int[3];aiNumeros[0] = 4;aiNumeros[1] = 33;aiNumeros[2] = 43;

Al declarar el arreglo especifique solamente el número de elementos que este contendrá. utilice la palabre reservada new seguido del tipo y entre corchetes el número de elementos que contendrá.

Es posible ordernar y buscar los elementos de un arreglo gracias a que los arreglos en C# están basados en el tipo System.Array del runtime NET. El método Sort() podría ordenar los elementos de un arreglo, los métodos IndexOf() y LastIndexOf() y BinarySearch podrían buscar elementos en un arreglo. El método Reverse podría invertir el orden de los elementos de un arreglo.

Arreglos Multidimensionales

Los Arreglos Multidimensionales son aquellos que tienen más de una dimensión.

Sintaxis:

tipo[,] identificador;

Ejemplo:

string[,] asBidimensional = new string[2, 4];

Para definir un arreglo multidimensional, simplemente defina arreglos como elementos del arreglo:

string[,] asMulti = {{"a","1"},{"b","2"},{"c","3"}};

Ejemplo:

using System; class App{ public static void Main(){

string[] asPersonas = {"Tim Berners-Lee", "Brendan Eich", "Dennis M. Ritchie", "James Gosling"};

Console.WriteLine("Longitud del arreglo asPersonas : " + asPersonas.Length);

int[] aiNumeros = new int[3] {1, 2, 3};

Console.WriteLine("Longitud del arreglo aiNumeros : " + aiNumeros.Length);

//Define 4 arreglos de 2 dimensionesint iRenglon = 4;int iColumna = 2;string[,] asBidimensional = new string[iRenglon, iColumna];// 4 renglones * 2 columnas = 8 Elementos

asBidimensional[0,0] = "00";asBidimensional[0,1] = "01";

asBidimensional[1,0] = "10";asBidimensional[1,1] = "11";

asBidimensional[2,0] = "20";asBidimensional[2,1] = "21";

asBidimensional[3,0] = "30";asBidimensional[3,1] = "31";

Console.WriteLine("Longitud del arreglo asBidimensional : " + asBidimensional.Length);

int[,] aiBidimensional = { {11,22}, {33,44}, {55,66}, {77,88} };

for(int i = 0; i < iRenglon; i++){ for(int j = 0; j < iColumna; j++){

Console.WriteLine("Dimensión " + i + " elemento " + j + " : " + aiBidimensional[i,j]);

}}Console.WriteLine("Longitud del arreglo aiBidimensional : " +

aiBidimensional.Length); } }

Arreglo de Arreglos

Un Arreglo de Arreglos es también conocido como jagged array porque no tiene que ser rígido.

Por ejemplo:

int[][] aiIDs = new int[3][];

Este ejemplo define un arreglo de arreglo de tipo int donde su dimensión es 3 elementos, donde estos elementos son arreglos.

Arreglos de Objetos

Un arreglo de objetos es creado utilizando new.

Es posible declarar y manipular arreglos de objetos de la siguiente manera:

using System;public class Persona{

//Propiedadespublic string sNombre;public int iEdad;//Constructorpublic Persona(string sNombre, int iEdad){

this.sNombre = sNombre;this.iEdad = iEdad;

}//Métodospublic string Tipo(){

return "Persona";}

}//Herencia Simplepublic class Empleado : Persona{

public Empleado(string sNombre, int iEdad):base(sNombre, iEdad){}

public new string Tipo(){return "Empleado";

}}

class App{//Aplicación

public static void Main(){Persona Mexicano = new Persona("Gerado Ángeles Nava",

33);Console.WriteLine("Mexicano.sNombre : " +

Mexicano.sNombre);Console.WriteLine("Mexicano.iEdad : " +

Mexicano.iEdad);Console.WriteLine("Mexicano.Tipo : " +

Mexicano.Tipo());

Console.WriteLine("--- Arreglo de Objetos ---");

Empleado[] aProgramadores = new Empleado[2];aProgramadores[0] = new Empleado("Bill Gates", 50);aProgramadores[1] = new Empleado("Eric S. Raymond",

60);for(int i = 0; i < aProgramadores.Length; i++){ Console.WriteLine("aProgramadores["+i+"].sNombre : "

+ aProgramadores[i].sNombre); Console.WriteLine("aProgramadores[" + i + "].iEdad :

" + aProgramadores[i].iEdad); Console.WriteLine("aProgramadores[" + i + "].Tipo :

" + aProgramadores[i].Tipo());}

}}

Conversión de Arreglos

Una conversión implícita es posible si los arreglos tienen el mismo número de dimensiones, si los elementos de un arreglo tienen una conversión de referencia implícita para los tipos de elementos del otro arreglo y ambos arreglos son tipos referencia.

Una conversión explícita tiene los mismos requerimientos de una conversión implícita excepto que los elementos de un arreglo deben ser convertibles explícitamente a los tipos de elementos del otro arreglo.

Clase Array

La clase Array provee entre otras, funciones de búsqueda y ordenamiento.

En el siguiente ejemplo se muestra como es ordenado un arreglo de strings:

using System;class App{ public static void Main(){

string[] aLenguajes = {"Java", "Pascal", "ActionScript", "PHP", "C#", "SQL",

"JavaScript", "C", "Java", "Prolog", "Visual Basic", "C++"};

Array.Sort(aLenguajes);for(int elemento = 0; elemento < aLenguajes.Length;

elemento++)Console.WriteLine("Elemento [" + elemento + "]

= " + aLenguajes[elemento]); }}

Salida:

Elemento [0] = ActionScriptElemento [1] = CElemento [2] = C#Elemento [3] = C++Elemento [4] = JavaElemento [5] = JavaElemento [6] = JavaScriptElemento [7] = PascalElemento [8] = PHPElemento [9] = PrologElemento [10] = SQLElemento [11] = Visual Basic

La función Sort(), también se puede utilizar con números:

using System;class App{ public static void Main(){

double[] aNumeros = {8.7, 6.9, -6.5, 4.2, -102.09, 1.9, 0.01, -0.002, 99.87};

Array.Sort(aNumeros);for(int elemento = 0; elemento < aNumeros.Length;

elemento++)Console.WriteLine("Elemento [" + elemento + "]

= " + aNumeros[elemento]); }}

Salida:

Elemento [0] = -102.09Elemento [1] = -6.5Elemento [2] = -0.002Elemento [3] = 0.01Elemento [4] = 1.9Elemento [5] = 4.2Elemento [6] = 6.9Elemento [7] = 8.7Elemento [8] = 99.87

Interface IComparable

La función sort no trabaja con clases o estructuras porque no conoce su orden, pero si desea ordenarlas utilice la interface IComparable, por ejemplo una ordenación utilizando una propiedad numérica:

using System;

public class Lenguaje : IComparable{string nombre;int id;public Lenguaje(string nombre, int id){

this.nombre = nombre;this.id = id;

}int IComparable.CompareTo(object o){

Lenguaje lenguajeB = (Lenguaje)o;if(this.id > lenguajeB.id){return 1;}if(this.id < lenguajeB.id){

return -1;}else{

return 0;}

}public override string ToString(){

return nombre + " " + id;}

}

class App{public static void Main(){

Lenguaje[] aLenguaje = new Lenguaje[5];aLenguaje[0] = new Lenguaje("C",3);aLenguaje[1] = new Lenguaje("ActionScript",5);aLenguaje[2] = new Lenguaje("JavaScript",2);aLenguaje[3] = new Lenguaje("Java",8);aLenguaje[4] = new Lenguaje("PHP",1);Array.Sort(aLenguaje);foreach(Lenguaje len in aLenguaje)

Console.WriteLine(len);}

}

Salida:

PHP 1

JavaScript 2C 3ActionScript 5Java 8

Interface IComparer

Es posible definir múltiples tipos de ordenamientos gracias a que el diseño del Framework provee esta capacidad.

Cada clase sólo puede implementar una interface a la vez, por lo que solamente se podría permitir un tipo de ordenamiento, entonces se requiere una clase separada para cada tipo de ordenamiento que implementen IComparer y podría también implementar la función Comapare():

using System;using System.Collections;public class Lenguaje : IComparable{

string nombre;int id;public Lenguaje(string nombre, int id){

this.nombre = nombre;this.id = id;

}int IComparable.CompareTo(object o){

Lenguaje lenguajeB = (Lenguaje)o;if(this.id > lenguajeB.id){return 1;}if(this.id < lenguajeB.id){

return -1;}else{

return 0;}

}public override string ToString(){

return nombre + " " + id;}public class OrdenaNombres : IComparer{

public int Compare(object oA, object oB){Lenguaje lenA = (Lenguaje)oA;Lenguaje lenB = (Lenguaje)oB;return

String.Compare(lenA.nombre,lenB.nombre);}

}}

class App{public static void Main(){

Lenguaje[] aLenguaje = new Lenguaje[5];aLenguaje[0] = new Lenguaje("C",3);aLenguaje[1] = new Lenguaje("ActionScript",5);aLenguaje[2] = new Lenguaje("JavaScript",2);aLenguaje[3] = new Lenguaje("Java",8);aLenguaje[4] = new Lenguaje("PHP",1);

ArrayList aList = new ArrayList();aList.Add(aLenguaje[0]);

aList.Add(aLenguaje[1]);aList.Add(aLenguaje[2]);aList.Add(aLenguaje[3]);aList.Add(aLenguaje[4]);aList.Sort((IComparer) new

Lenguaje.OrdenaNombres());foreach(Lenguaje len in aList)

Console.WriteLine(len);}

}

Salida:

ActionScript 5C 3Java 8JavaScript 2PHP 1

IComparer Como Propiedad

En el ejemplo anterior el usuario tiene que crear una instancia del ordenamiento deseado y hacer un cast de IComparer, pero es posible simplificar esto utilizando una propiedad estática y hacerlo por el usuario:

using System;using System.Collections;public class Lenguaje : IComparable{

string nombre;int id;public Lenguaje(string nombre, int id){

this.nombre = nombre;this.id = id;

}int IComparable.CompareTo(object o){

Lenguaje lenguajeB = (Lenguaje)o;if(this.id > lenguajeB.id){return 1;}if(this.id < lenguajeB.id){

return -1;}else{

return 0;}

}public override string ToString(){

return nombre + " " + id;}public static IComparer Ordena{

get{return (IComparer) new OrdenaNombres();

}}public class OrdenaNombres : IComparer{

public int Compare(object oA, object oB){Lenguaje lenA = (Lenguaje)oA;Lenguaje lenB = (Lenguaje)oB;return

String.Compare(lenA.nombre,lenB.nombre);}

}

}

class App{public static void Main(){

Lenguaje[] aLenguaje = new Lenguaje[5];aLenguaje[0] = new Lenguaje("C",3);aLenguaje[1] = new Lenguaje("ActionScript",5);aLenguaje[2] = new Lenguaje("JavaScript",2);aLenguaje[3] = new Lenguaje("Java",8);aLenguaje[4] = new Lenguaje("PHP",1);

Array.Sort(aLenguaje, Lenguaje.Ordena);

foreach(Lenguaje len in aLenguaje)Console.WriteLine(len);

}}

Salida:

ActionScript 5C 3Java 8JavaScript 2PHP 1

Expresiones Regulares

Las Expresiones Regulares proveen un método muy poderoso para hacer funciones de busquedas y reemplazamiento.

Operador as

El Operador as checa el tipo del operador izquierdo y si puede ser convertido explicitamente a el operador derecho, se obtiene como resultado el objeto convertido a el operador derecho, si no puede ser convertido la operación falla y regresa null. Este operador sólo puede se utilizado con clases.

Secuencias de Escape

Secuencia de Escape Descripción

' Comilla simple

" Comilla doble

\ Diagonal invertida

Nulo

a Alert

b Retroceso

f Form Feed

n Nueva línea

r Retorno de carro

t Tabulador

v Tabulador vertical

Boxing

Boxing es un mecanismo que crea una liga entre los tipos de valores y las tipos de referencia permitiendo a un tipo de valor ser convertido a un tipo objeto y viceversa.

using System;class App{

public static void Main(){int iEdad = 33;object oNumero = iEdad; //Boxint iNumero = (int)oNumero; //Unbox //cast necesario porque oNumero podría contener

cualquier tipo de objeto}

}

Nota, durante la conversión unboxing el tipo debe coincidir exactamente, un valor de tipo boxed no puede ser unboxed (convertido) a un tipo compatible. Si requiere obtener otro tipo de valor diferente al que contiene el boxed, en ese caso primero obtenga el valor correcto y después realice un cast al tipo que requiera: (valorRequerido)

valorRequerido vr = (valorRequerido)(valorBoxed)objeto;

Otra forma de definir el concepto boxing es que este mecanismo permite que los value types parezcan o tengan la apariencia de reference types.

Conversiones Boxing

Boxing un valor se refiere a la conversión implícita de cualquier tipo de valor al tipo objeto. Cuando un tipo de valor es boxed se asigna espacio a una instancia de objeto y el valor del value type es copiado al nuevo objeto.

Observe las siguientes líneas:

int iNumero = 2012;object oNumero = iNumero; //invocación

implicita a una operación boxing

Al asignar el valor de la variable entera nNumero a una variable objeto se realiza internamente una operación boxing, donde el valor de la variable nNumero es copiado al objeto oNumero, entonces las variables entera y objeto existen en la pila pero los valores de los objetos residen en el área o espacio asignado, lo que implica que los valores son independientes y no hay una liga entre ellos:

using System;class Box{

public static void Main(){

int iNumero = 2012;object oNumero = iNumero; //invocación

implicita a una operación boxing

oNumero = 2005;Console.WriteLine(iNumero);Console.WriteLine(oNumero);

}}

Al ejecutar el código notará que el valor de oNumero es 2005 y el valor de iNumero no cambio permanece en 2012.

Conversiones Unboxing

Al contrario que Boxing, Unboxing es un mecanismo de una operación explícita, por lo que es necesario indicar al compilador que tipo de valor deseamos extraer de un objeto, al realizar la operación Unboxing C# checa que el value type que se requiere este almacenado en la instancia del objeto, si la verificación es exitosa el valor es Unboxing.

Suponga que tiene una variable de tipo int y asigna el valor de esta variable int a un objeto, después declara una variable de tipo double y aplica un cast (double) al objeto para asignar su valor a la variable double, el objeto contiene sólo un valor int y no puede ser asignado a la variable double porque el CLR dispara una excepción (System.InvalidCastException):

int iNumero = 2012;object oNumero = iNumero; //invocación implicita a una

operación boxingdouble dNumero = (double)oNumero; //invocacion

explícita (cast)//CLR dispara la excepción System.InvalidCastException

Constructores y Destructores

Antes de acceder a los métodos o propiedades de una clase, primero se ejecuta el constructor de la clase el cual contiene código de inicialización, si no se escribe un constructor para la clase el compilador provee automáticamente un constructor default.

En el runtime .NET el programador no puede controlar la destrucción de objetos.

Un constructor puede invocar un constructor del tipo base utilizando la sintaxis base.

Los constructores son invocados invocados automaticamente sólo cuando una instancia de un objeto es creada con new.

class NombreClase{public NombreClase() : base(){} //Constructor que

provee el compilador}

Las características de un constructor son:

Siempre tiene el mismo nombre que la clase. No tiene declarado un tipo de regreso. Por lo general tienen el modificador público. Son utilizados para inicializar varibles. Si la clase sólo contiene miembros estáticos, es posible crear un constructor

private, lo cual significa que no podrá ser accesible fuera de la calse o que sólo se puede acceder desde la clase.

No puede ser invocado desde la definición de la clase. Un objeto no puede ser instanciado desde la definición de la clase.

Al codificar no se está limitado a los parámetros del constructor, es posible enviar argumentos iniciales para inicializar ciertos miembros.

using System;

class Vehiculo{//Propiedades:private int iRueda;private int iPuerta;private int iVentana;private int iHelice;private int iMotor;private int iAsiento;private string sTipo;//Aereo, anfibio, terrestre,

espacial

//Constructor:public Vehiculo(int Rueda, int Puerta, int Ventana, int

Helice, _int Motor, int Asiento, string Tipo){

iRueda = Rueda;iPuerta = Puerta;iVentana = Ventana;iHelice = Helice;iMotor = Motor;iAsiento = Asiento;sTipo = Tipo;

}

//Lectura/escritura de propiedades:public int Ruedas{

get{return iRueda;}set{iRueda = value;}

}

public int Puertas{get{return iPuerta;}set{iPuerta = value;}

}

public int Ventanas{get{return iVentana;}set{iVentana = value;}

}

public int Helices{get{return iHelice;}

set{iHelice = value;}}

public int Motores{get{return iMotor;}set{iMotor = value;}

}

public int Asientos{get{return iAsiento;}set{iAsiento = value;}

}

public string Tipo{get{return sTipo;}set{sTipo = value;}

}

}

//Aplicación:class AplicConstructor{

public static void Main(){Vehiculo MiAvion = new

Vehiculo(2,1,100,0,3,200,"Aereo");Console.WriteLine("Ruedas : " +

MiAvion.Ruedas);Console.WriteLine("Puertas : " +

MiAvion.Puertas);Console.WriteLine("Ventanas : " +

MiAvion.Ventanas);Console.WriteLine("Helices : " +

MiAvion.Helices);Console.WriteLine("Motores : " +

MiAvion.Motores);Console.WriteLine("Asientos : " +

MiAvion.Asientos);Console.WriteLine("Tipo : " +

MiAvion.Tipo);}

}

En un sentido estricto en C# no se tienen destructores, pero el termino destructor se refiere a la liberación de recursos.

Es posible escribir un método que libere recursos después de ser utilizados, pero porque escribir un método para liberar recursos si existe un destructor:

public ~NombreClase(){//liberar recursos

}

La razón por la cual se debería escribir un método adicional es por el recolector de basura, el cual no es invocado inmediatamente después que las variables quedan fuera de ámbito, sólo se invoca el recolector de basura en ciertos intervalos o condiciones de memoria.

Lo que podría suceder es que los recursos se agoten antes de ser utilizados, entonces es buena idea proveer un método explícito Release, el cual también puede ser invocado por el destructor:

public void Release(){//Liberar recursos

}public ~NombreClase(){

Release();}

La invocación del método Release en el destructor no es obligatoria, la colección garbage de cualquier forma realiza la liberación de cualquier objeto, pero es una buena práctica no olvidar liberar los recursos.

Constructor Estático

Un Constructor Estático podría ser invocado antes de ser creada la primer instancia de un objeto, y es útil para configurar el trabajo que necesita hacerse una vez.

En el runtime .NET el usuario no tiene control sobre cuando el constructor estático es invocado, ya que el runtime sólo garantiza que algo es invocado después del inicio del programa y antes de ser creada la primer instancia de un objeto, lo que significa que no puede ser determinada la instancia que es creada en el constructor estático.

Para declarar un constructor estático se utiliza el modificador static:

class NombreClase{static NombreClase(){ . .}

}

Métodos

La mayor parte de la funcionalidad es implementada en los métodos, los métodos son parte del Tipo (class), pero los métodos no son parte de la instancia (object).

Parámetros

De algún modo se deben pasar valores a un método y también se debe regresar el resultado de un método, los valores son manipulados en:

Valores en Parámetros in

Se utilizan valores en parámetros para pasar una variable por valor a un método, la variable del método es inicializada con una copia del valor del caller (quien realizó la invocación).

using System;

public class Fecha{public string Mayor(int iDiaA,int iMesA,int iAñoA,int

iDiaB,int iMesB,int iAñoB){int iA = (iDiaA * 10000) + (iMesA + 100) +

(iAñoA);int iB = (iDiaB * 10000) + (iMesB + 100) +

(iAñoB);Console.WriteLine(iA + " > " + iB); //Test

Line (Delete)if(iA > iB){

return iDiaA + "/" + iMesA + "/" + iAñoA;

}else{return iDiaB + "/" + iMesB + "/" +

iAñoB;}

}public string Menor(int iDiaA,int iMesA,int iAñoA,int

iDiaB,int iMesB,int iAñoB){int iA = (iDiaA * 10000) + (iMesA + 100) +

(iAñoA);int iB = (iDiaB * 10000) + (iMesB + 100) +

(iAñoB);Console.WriteLine(iA + " < " + iB); //Test

Line (Delete)if(iA < iB){

return iDiaA + "/" + iMesA + "/" + iAñoA;

}else{return iDiaB + "/" + iMesB + "/" +

iAñoB;}

}}

class AplicFecha{ public static void Main(){

Fecha MiFecha = new Fecha();Console.WriteLine("La fecha mayor es : " +

MiFecha.Mayor(21,9,1971, 21,10,2000));Console.WriteLine("La fecha menor es : " +

MiFecha.Menor(21,9,1971, 21,10,2000));

Console.WriteLine("La fecha mayor es : " + MiFecha.Mayor(21,10,2000, 21,9,1971));

Console.WriteLine("La fecha menor es : " + MiFecha.Menor(21,10,2000, 21,9,1971));

Console.WriteLine("La fecha mayor es : " + MiFecha.Mayor(21,10,2000, 21,9,2005));

Console.WriteLine("La fecha menor es : " + MiFecha.Menor(21,10,2000, 21,9,2005));

}}

Al pasar un valor y no una referencia a la variable, es posible utilizar expresiones constantes, el resultado de los métodos Mayor y Menor es pasado a el caller como un valor de regreso y es manipulado sin ser almacenarlo en una variable intermedia.

Si no hay modificadores los parámetros son siempre pasados por valor.

Valores en Parámetros ref

Es posible pasar un valor como parámetro a un método, modificar el valor y regresarlo como resultado del método, para ello se utiliza el modificador ref seguido del tipo y del nombre del parámetro.

Al contrario de los valores en parámetros no se pasa una copia del valor, sino la referencia del valor y por ello al modificar el valor se hace la modificación directa, también es necesario inicializar el valor que se pasa como paramétro por medio de una variable intermedia y no directamente a través de una expresión constante:

using System;

public class Param{public void ParametroRef(ref int RefParametro){//No

regresa un valor explícitoRefParametro *= RefParametro; //Se modifica el

valor directamente//No se regresa un valor, porque se modifico de

manera directa}

}

class Parametros{ public static void Main(){

Param MiParam = new Param();

int iValorRef = 5; //Se requiere inicializar el valor

MiParam.ParametroRef(ref iValorRef);//Se invoca el método

pasando la referencia del valorConsole.WriteLine("ref : " + iValorRef);

}}

Good Practice, se recomienda tener dos variables, una en el parámetro y otra en el parámetro ref.

Recuerde, el compilador de C# no permite utilizar variables que no han sido inicializadas, por lo que antes de utilizar o establecer los valores de una variable debe ser inicializada, para ello existen dos formas de hacerlo:

1. Inicializar la variable al declararla. 2.3. using System;4.5. class MiClase{6. private int MiPropiedad;7. public void AsignarValor(ref int MiRefParam){8. this.MiPropiedad = MiRefParam;9. }10. public static void Main(){

11. MiClase MiObjeto = new MiClase();12. int MiEdad = 33;//Se inicializa la variable al

declararla13. MiObjeto.AsignarValor(ref MiEdad);14. Console.WriteLine("MiEdad : " + MiEdad);15. Console.WriteLine("MiObjeto.MiPropiedad : " +

MiObjeto.MiPropiedad);16. }17. }

18. Por ejemplo cambiar la definición de la función y utilizar un parámetro out en vez de un parámetro ref.

19. using System;20.21. class MiClase{22. private int MiPropiedad;23. public void AsignarValor(out int MiOutParam){//Se

cambia la definición de la función 24. MiOutParam = 33;25. this.MiPropiedad = MiOutParam;26. }27. public static void Main(){28. MiClase MiObjeto = new MiClase();29. int MiEdad;//No se inicializa la variable30. MiObjeto.AsignarValor(out MiEdad);31. Console.WriteLine("MiEdad : " + MiEdad);32. Console.WriteLine("MiObjeto.MiPropiedad : " +

MiObjeto.MiPropiedad);33. }34. }

Los parámetros out son exactamente como los parámetros ref excepto que una variable sin inicializar puede ser pasada como parámetro y el caller define un parámetro out en vez de ref.

Valores en Parámetros out

Un parámetro out puede ser utilizado sólo para contener el resultado de un método, es necesario especificar el modificador out para indicar el tipo de parámetro, a diferencia de los parámetros ref el caller no necesita inicializar la variable antes de invocar el método:

using System;

public class Param{public void ParametroOut(out int OutParametro){

OutParametro = 4 * 4;//No se gregresa un valor, porque es regresado

en el parámetro out}

}

class Parametros{ public static void Main(){

Param MiParam = new Param();

int iValorOut; //No se requiere inicilizar el valorMiParam.ParametroOut(out iValorOut); //Se invoca el

método con un parámetro outConsole.WriteLine("out : " + iValorOut);//Resultado de

la invocación del método }}

Ejemplo de Parámetros In, Ref y Out

using System;

public class Param{public int ParametroIn(int InParametro){

return InParametro * InParametro;}

public void ParametroRef(ref int RefParametro){//No regresa un valor explícito

RefParametro *= RefParametro; //Se modifica el valor directamente

//No se regresa un valor, porque se modifico de manera directa

}

public void ParametroOut(out int OutParametro){OutParametro = 4 * 4;//No se gregresa un valor, porque es regresado

en el parámetro out}

}

class Parametros{ public static void Main(){

Param MiParam = new Param();

Console.WriteLine(" in : " + MiParam.ParametroIn(3));

int iValorRef = 5; //Se requiere inicializar el valor

MiParam.ParametroRef(ref iValorRef);//Se invoca el método pasando la referencia del valor

Console.WriteLine("ref : " + iValorRef);

int iValorOut; //No se requiere inicilizar el valorMiParam.ParametroOut(out iValorOut); //Se invoca el

método con un parámetro out

Console.WriteLine("out : " + iValorOut);//Resultado de la invocación del método

}}

Redefinición de Métodos (Overriding)

Uno de los principios básicos de la programación orientada a objetos es el polimorfismo, el cual hace posible que una clase derivada pueda redefinir (override)

métodos de la clase base. Para indicar que se puede redefinir el método se emplea la palabra reservada virtual:

virtual void NombreMetodo_PuedeSerRedefinido

Después, al derivar de la clase base se agrega la palabra reservada override en el nuevo método:

override void NombreMetodo_PuedeSerRedefinido()

No es posible cambiar la accesibilidad de un método que es redefinido, es decir, no es posible cambiar los modificadores que definen al método.

Cuando se invoca un método virtual se está derivando el método de clase que es invocado y no el método de la clase base:

((ClaseBase)InstanciaClaseDerivada).NombreMetodo_PuedeSerRedefinido();

Para indicar que una clase deriva de otra se utiliza el operador : el cual denota esta acción:

class ClaseDerivada : ClaseBase{}

El siguiente ejemplo muestra como se redefine un método:

using System;class ClaseBase{

public virtual int Calculo(int iA, int iB){return iA + iB;

}}

class ClaseDerivada : ClaseBase{//Se deriva de la clase base public override int Calculo(int iA, int iB){//Se especifica

que el método será redefinidoreturn iA - iB;//Se redefine la funcionalidad del

método }}

class RedefinirMetodos{public static void Main(){

ClaseBase ClsBase = new ClaseBase();Console.WriteLine("Clase base : " +

ClsBase.Calculo(5,3));//Se crea una instancia de la clase derivada:ClaseDerivada ClsDer = new ClaseDerivada();//Se invoca el método redefinido en la clase

derivada:Console.WriteLine("Clase derivada : " +

ClsDer.Calculo(5,3));}

}

Ocultamiento de Métodos (Hiding)

Es posible ocultar métodos de la clase base, esto se logra haciendo uso de una característica especial de la redefinición de métodos llamada ocultamiento de métodos y al derivar de la clase base:

using System;

class ClaseBase{//Sin código

}

class ClaseDerivada : ClaseBase{//Clase derivada de la clase base

public void MetodoOculto(){//Método OcultoConsole.WriteLine("Hiding Methods");

}}

class Hiding{public static void Main(){

ClaseDerivada MiClaseDerivada = new ClaseDerivada();

MiClaseDerivada.MetodoOculto();}

}

El código anterior demuestra que es posible derivar una clase que implementa un método que la clase base no contiene.

Por otro lado si la clase base contiene el método y se trata de derivar una clase que trata de implemetar un método que si contiene la clase, se produce un error:

using System;

class ClaseBase{public void MetodoOculto(){

Console.WriteLine("Hiding Methods");}

}

class ClaseDerivada : ClaseBase{//Clase derivada de la clase base

public void MetodoOculto(){//Se implementa un método que si existe

Console.WriteLine("Hiding Methods");}

}

class Hiding{public static void Main(){

ClaseDerivada MiClaseDerivada = new ClaseDerivada();

MiClaseDerivada.MetodoOculto();}

}

El compilador indicará un mensaje similar al siguiente:

Hiding.cs(10,14): warning CS0108: The keyword new is required on 'ClaseDerivada.MetodoOculto()'

because it hides inherited member 'ClaseBase.MetodoOculto()'

Hiding.cs(4,14): (Location of symbol related to previous warning)

El error principal es que no se hace uso del modificador new, ya que si es posible ocultar un método contenido en la clase base:

using System;

class ClaseBase{public void MetodoOculto(){//Método Oculto

Console.WriteLine("Hiding Methods");}

}

class ClaseDerivada : ClaseBase{//Clase derivada de la clase base

new public void MetodoOculto(){//Método OcultoConsole.WriteLine("Hiding Methods using new");

}}

class HidingClassMet{public static void Main(){

ClaseDerivada MiClaseDerivada = new ClaseDerivada();

MiClaseDerivada.MetodoOculto();}

}

Al hacer uso del modificador new, se le indica al compilador que se está redefiniendo el método de la clase base y que debería ocultar este método.

Se puede asegurar de invocar el método que redefine la clase derivada utilizando la siguiente sintaxis:

((ClaseBase)MiClaseDerivada).MetodoOculto();

Propiedades

Las propiedades son convenientes para separar la interfaz de un objeto de su implementación, en vez de permitir a un usuario acceder directamente a un campo o arreglo, una propiedad permite especificar a un conjunto de sentencias realizar el acceso mientras se permita utilizar el campo o arreglo.

class NombreClase{

int iNombrePropiedad; //declaración de la propiedad

//Especificación del acceso a la propiedadpublic int NombrePropiedad{

get{return iNombrePropiedad;}set{iNombrePropiedad = value;}

}}

Ejemplo:

using System;class Propiedades{

private int iEdad;public int Edad{

get{return iEdad;}set{iEdad = value;}

}

private string sNombre;public string Nombre{

get{return sNombre;}set{sNombre = value;}

}

private bool bMexicano;public bool Mexicano{

get{return bMexicano;}set{bMexicano = value;}

}

public static void Main(){Propiedades Ciudadano = new Propiedades();

Ciudadano.Edad = 33;Console.WriteLine("Edad Ciudadano : " +

Ciudadano.Edad);

Ciudadano.Nombre = "Gerardo Ángeles Nava";Console.WriteLine("Nombre Ciudadano : " +

Ciudadano.Nombre);

Ciudadano.Mexicano = true;Console.WriteLine("Mexicano Ciudadano : " +

Ciudadano.Mexicano);}

}

Existen dos maneras de exponer el nombre de los atributos:

1. Campos (fields)2. Propiedades (properties)

Los atributos son implementados como variables miembro con acceso público via accessors (get o set).

Los accessors (get o set) especifican las sentencias que son ejecutadas cuando se requiere leer o escribir el valor de una propiedad.

Los accessors para la lectura del valor de una propiedad son marcados con la palabra reservada get y los accessors para modificar el valor de una propiedad son marcados con la palabra reservada set.

El siguiente ejemplo muestra como se implentan los accessors para las propiedades:

using System;

class Persona{private int iSueldo;public int Sueldo{

get{return iSueldo;}set{iSueldo = value;}

}}

class AplicPersona{public static void Main(){

Persona Empleado = new Persona();Empleado.Sueldo = 33;Console.WriteLine("Edad : " + Empleado.Sueldo);

}}

Note, que se utiliza el parámetro value, ya que el valor actual es almacenado en este que es accesible dentro de la clase.

Si en vez de utilizar propiedades desea utilizar campos deberá dejar fuera los accessors y redefinir la variable como:

public int Sueldo;

Accessors

Es posible ocultar los detalles de la estructura de almacenamiento de la clase reordenando los accessors, en este caso el accessors set es pasado en el nuevo valor para la propiedad en el parámetro value.

Las operaciones que pueden realizarse con los atributos son:

Implementar get y set, es posible tener acceso al valor de la propiedad para leerlo y escribirlo.

get only, sólo es posible leer el valor de la propiedad. set only, sólo es posible establecer el valor de la propiedad.

Propiedades Estáticas

Propiedades estáticas no pueden ser declaradas con los modificadores virtual, abstract u override.

Las propiedades estáticas pueden ser inicializadas hasta que sea necesario hacerlo, el valor puede ser fabricado cuando se necesite sin almacenarlo.

using System;

class Persona{int iPiernas;int iBrazos;int iOjos;public Persona(int piernas, int brazos, int ojos){

this.iPiernas = piernas;this.iBrazos = brazos;this.iOjos = ojos;

}public static Persona Piernas{

get{return(new Persona(2,0,0));

}} public static Persona Brazos{

get{return(new Persona(0,4,0));

}}public static Persona Ojos{

get{return(new Persona(0,0,8));

}}

}

class App{public static void Main(){

Persona ET = Persona.Piernas;Console.WriteLine(ET);

}}

Índices

Es posible incluir una forma de acceso indexado a la clase tal como si la clase se tratará de un arreglo, para ello se utiliza la característica de C# indexer, sintaxis:

atributos modificadores declarador{instrucciones}

Los índices o indexers regresan o establecen un string en un índice dado, los indexers no tienen atributos por lo que utilizan el modificador public.

La parte del declarador consiste del tipo string y la palabra reservada this para denotar el indexer de la clase:

public string this[int iIndex]{get{intrucciones}set{intrucciones}

}

Las reglas de implementación para get y set son las mismas reglas de las propiedades, la única diferencia es que la lista de parámetros se define libremente entre los corchetes, también existen restricciones como que es necesario especificar al menos un parámetro y los modificadores ref y out no están permitidos.

Ejemplo:

using System;using System.Net;//Directiva namespace para la clase DNS

class ResolverDNS{IPAddress[] aIPs;public void Resolver(string strHost){

IPHostEntry IPHE = Dns.GetHostByName(strHost);aIPs = IPHE.AddressList;

}public IPAddress this[int iIndex]{

get{return aIPs[iIndex];}}public int Contador{

get{return aIPs.Length;}}

}

class AplicResolverDNS{public static void Main(){

ResolverDNS MiDNS = new ResolverDNS();MiDNS.Resolver("www.informatique.com.mx");

int iContador = MiDNS.Contador;Console.WriteLine("Se encontro {0} para el host

", iContador);for(int i = 0; i < iContador; i++){

Console.WriteLine(MiDNS[i]);}

}}

Si el namespace para la clase DNS no está contenida en la biblioteca central, al compilar incluya la referencia a la biblioteca que la contiene:

csc /r:System.Net.dll /out:resolver.exe AplicResolverDNS.cs

Los índices pueden tener más que un parámetro para simular un arreglo virtual multidimensional.

Eventos

Una clase puede usar un evento para notificar a otra clase o clases que algo ocurrio, los eventos usan el idioma "publish-subscribe", ya que una clase publica el evento que puede lanzar y las clases que están interesadas en un evento específico pueden subscribir al evento.

La rutina o tarea que un evento podría invocar es definida por un delegado.

Para tratar de manera fácil con eventos, la convención de diseño para eventos es emplear dos parámetros, donde el primer parámetro es el objeto que lanza el evento y el segundo parámetro es un objeto que contiene la información acerca del evento el cual siempre deriva de la clase EventArgs.

Los eventos pueden ser declarados como campos o propiedades de clase, ambos accesos comparten la comodidad de tipo que el evento debe tener delegate.

Cada evento puede ser utilizado por cero o más clientes y un cliente puede utilizar un evento en cualquier momento.

Los delegados pueden ser implementados como métodos o instancias estáticas.

Modificadores

Los modificadores pueden clasificarse en:

Modificadores de Clase Modificadores Miembro Modificadores de Acceso

Modificadores de Clase

Existen dos tipos de modificadores de clase:

1. abstract o Una clase abstracta no puede ser inicializadao Sólo clases derivadas que no son abstractas pueden ser inicializadaso Las clases derivadas deben implementar todos los miembros abstractos

de la clase base abstractao No puede aplicarse un modificador sealed a una clase abstracta

2. sealed o Clases sealed no pueden ser heredadaso Utilice este modificador para prevenir herencia accidental

Ejemplo:

using System;

abstract class ClaseAbstracta{abstract public void MiMetodo();

}

sealed class ClaseDerivada:ClaseAbstracta{public override void MiMetodo(){

Console.WriteLine("Clase sealed");}

}

public class ModificadorClase{public static void Main(){

ClaseDerivada CD = new ClaseDerivada();CD.MiMetodo();

}}

Modificadores Miembro

Algunos modificadores miembro son:

abstract o Indica que un método o accessor no contiene una implementación, que

son implicitamente virtual. o La clase que recibe la herencia debe proveer la palabra reservada

override. const

o Este modificador aplica a campos y variables localeso La expresión constante es evaluada en tiempo de compilación, por lo

tanto no puede contener referencias de la clase. event

o Define un campo o propiedad como tipo evento Utilizado para ligar al código cliente a eventos de la clase

extern o Indica al compilador que el método es implemetado externamente

override o Utilizado para modificar un método o accessor que es definido virtual

en cualquiera de las clases baseo La firma de redefinición y método base debe ser el mismo

readonly o Un campo declarado con el modificador readonly puede ser cambiado

sólo en su declaración o en el constructor de la clase contenedora static

o Miembros que son declarados static pertenecen a la clase y no a una instancia de la clase

o Pueden utilizarse modificadores static con campos, métodos, propiedades, operadores y constructores.

virtual o Indican que un método o accessor pueden ser redefinidos por las clases

que reciben la herencia.

Modificadores de Acceso

Los modificadores de acceso definen el nivel de acceso que cierto código tiene en los miembros de la clase como métodos y propiedades. Es necesario aplicar el modificador de acceso deseado a cada miembro, de otra forma el tipo de acceso por default es implícito.

Los modificadores de acceso son:

public, el miembro es accesible desde cualquier parte, este modificador de acceso es el menos restrictivo.

protected, el miembro es accesible en la clase y todas las clases derivadas. No es permitido el acceso desde fuera.

El acceso protected permite a otras clases depender de la implementación interna de la clase y por lo tanto deberían ser otorgados sólo cuando sea necesario.

private, sólo el código dentro de la misma clase puede acceder este miembro. Las clases derivadas no pueden acceder al código.

internal, este tipo de acceso es otorgado a todo el código que es parte del mismo componente (aplicación o biblioteca) .NET, es visto como público a nivel del componente .NET y privado fuera de este. Este modificador permite que un miembro sea accesible desde las clases en el mismo ensamblaje, pero no desde las clases fuera de este.

El modificador internal protected provee mayor flexibilidad en como una clase es definida y se utiliza para indicar que un miembro pueder ser accedido desde una clase internal o protected, en otras palabras internal protected permite acceso internal o protected.

Sentencias de Control

Las Sentencias de Control se emplean para controlar la ejecución y flujo del código, las cuales se dividen en:

1. Sentencias de Selección 2. Sentencias de Iteración

Sentencias de Selección

Las Sentencias de selección son aquellas que se utilizan para realizar operaciones basadas en el valor de una expresión.

Las Sentencias de selección son aquellas que se utilizan para escribir diferentes flujos de acción en base a una condición dada, existen dos tipos de sentencias de selección:

1. Sentencia if 2. Sentencia switch

Sentencia if

Al escribir uno o varios flujos de acción el código contenido en estos se ejecutará siempre y cuando la evaluación de la expresión en la sentencia if se evalue como verdadera (tenga cuidado en C# if(0){} o if(1){} no es válido).

if(expresión-booleana){la expresión se evaluo verdadera}

Es posible indicar código alterno en caso de que la expresión booleana se evalue falsa:

if(expresión-booleana){la expresión se evaluo verdadera

}else{la expresión se evaluo falsa

}

Nota C# no puede convertir valores numéricos a booleanos, solo puede hacer comparaciones entre ellos para evaluar el resultado de la expresión el cual es un valor booleano.

using System;class SeleccionIf{

public static void Main(){if(1 == 1){

Console.WriteLine("se evaluo verdadero");

}/* No es soportado por C#if(0){

Console.WriteLine("?");} */

}}

Nota el operador de igualdad en C# es ==, si está habituado a otra forma, sera cosa tiempo acostumbrarse a escribirlo correctamente, en la siguiente tabla se muestran los operadores válidos en C#:

Operador Evalua

== Verdadero, si ambos valores son los mismos

!= Verdadero, si los valores son diferentes

<, <=, >, >= Verdadero, si el valor cumple con la condición

Los operadores de la tabla son implementados via la sobrecarga de operadores y la implementación es especifica para el tipo de dato, si se comparan dos variables de diferente tipo se realiza una conversión implícita que debe existir para que el compilador cree el código necesario automáticamente. Recuerde que siempre podrá realizar un cast explícito.

Ejemplo

using System;

class Caracteres{public static void Main(){

string sNombre = "Gerardo Angeles Nava";

char chLetra = sNombre[0];//Extrae el primer caracter del string

if(Char.IsDigit(chLetra)){Console.WriteLine(chLetra + " es un

dígito");}else{

EsMayuscula(chLetra);EsMinuscula(chLetra);

}

chLetra = sNombre[1];//Extrae el segundo caracter del string

if(Char.IsDigit(chLetra)){Console.WriteLine(chLetra + " es un

dígito");}else{

EsMayuscula(chLetra);EsMinuscula(chLetra);

}

sNombre = "123";chLetra = sNombre[2];//Extrae el tercer

caracter del string

if(Char.IsDigit(chLetra)){Console.WriteLine(chLetra + " es un

dígito");}else{

EsMayuscula(chLetra);EsMinuscula(chLetra);

}}public static void EsMayuscula(char chCaracter){

if(chCaracter >= 'A' && chCaracter <= 'Z'){Console.WriteLine(chCaracter + "

mayúscula");}

}public static void EsMinuscula(char chCaracter){

if(chCaracter >= 'a' && chCaracter <= 'z'){Console.WriteLine(chCaracter + "

minúscula");}

}}

En el ejemplo anterior se muestra la aplicación de la sentencia de selección if y el uso del método IsDigit de la clase Char, también se muestra como determinar si un caracter correponde a las letras mayúsculas o minúsculas.

Good Practice: nunca asigne valores a variables dentro de una condición que utiliza operadores lógicos (&&,||,!), porque puede que nunca se le asigne el valor correspondiente a la variable en caso de que una expresión anterior se evalue verdadera:

if(a == b || (c == (iValor = d))){}

En el ejemplo anterior, si la expresión a == b se evalua verdadera entonces la variable iValor nunca contendrá el valor d.

Sentencia switch

La sentencia de selección switch tiene una expresión de control y los flujos de código alternos son ejecutados dependiendo del valor constante asociado con esta expresión.

switch(expresion-de-control){case expresion-contante:

sentencias;break;

case expresion-contante:goto case 2;

case expresion-contante:goto default;

default:sentencias;

}

Los tipos de datos permitidos para la expresión de control son sbyte, byte, short, ushort, uint, long, ulong, char, string o un tipo enumeración (enumeration).

¿Cómo funciona la sentencia de selección switch?

Se evalua la expresión de control Si la expresión constante en las etiquetas case coincide con el valor evaluado en

la expresión de control, entonces las sentencias contenidas para ese caso son ejecutadas

Si la expresión constante en las etiquetas case no coincide con el valor evaluado en la expresión de control, entonces el código contenido en el caso por default es ejecutado

Si la expresión constante en las etiquetas case no coincide con el valor evaluado en la expresión de control y no existe un caso por default, entonces el control es transferido al final del bloque switch

Ejemplo:

using System;

class SentenciaSwitch{public static void Main(){

for(int i = 0; i <= 12; i++){Mes(i);

}}public static void Mes(int iMes){

switch(iMes){case 1:

Console.WriteLine("Enero");break;

case 2:Console.WriteLine("Febrero");break;

case 3:Console.WriteLine("Marzo");break;

case 4:Console.WriteLine("Abril");break;

case 5:Console.WriteLine("Mayo");break;

case 6:Console.WriteLine("Junio");

break;case 7:

Console.WriteLine("Julio");break;

case 8:Console.WriteLine("Agosto");break;

case 9:Console.WriteLine("Septiembre");break;

case 10:Console.WriteLine("Octubre");break;

case 11:Console.WriteLine("Noviembre");break;

case 12:Console.WriteLine("Diciembre");break;

default:Console.WriteLine("Mes no

válido");break;

}}

}

Es posible utilizar sentencias goto dentro del switch de la siguiente manera:

goto case expresion-contante goto default

Ejemplo:

using System;

class SentenciaSwitch{public static void Main(){

int iOpcion = 4;Opcion(iOpcion);iOpcion = 2;Opcion(iOpcion);iOpcion = 8;Opcion(iOpcion);iOpcion = 10;Opcion(iOpcion);

}public static void Opcion(int iValor){

switch(iValor){case 2:

goto case 6;case 4:

Console.WriteLine(" cuatro");break;

case 6:Console.WriteLine(" seis");break;

case 8:goto default;

case 10:

Console.WriteLine(" diez");break;

default:Console.WriteLine(" por

defecto");break;

}}

}

Sentencias de Iteración (repetición)

Las Sentencias de Iteración (también conocidas como looping statements) son aquellas que nos permiten ejecutar un bloque de código repetidamente mientras una condicíon específica sea verdadera:

for foreach while do

Sentencia for

La Sentencia for se utiliza cuando se conoce previamente cuantas veces ha de repetirse un bloque de código. Este bloque se repetira mientras la condición evalue una expresión booleana verdadera, no será posible evaluar otro tipo de expresión.

Sintaxis:

for(inicializador; condición; iterador)

Los componentes de la sentencia for: inicializador, condición, iterador, no son obligatorios.

Es posible salir de un ciclo for a través de las instrucciones:

1. break

2. goto

Ejemplo:

using System;

class Factorial{ public static void Main(string[] aArgs){

if(aArgs.Length == 0){Console.WriteLine("Debe proporcionar un

argumento, Ejemplo: Factorial 5");return;

}

long lFactorial = 1;long lCalcular = Int64.Parse(aArgs[0]);

long lAux = 1;for(lAux = 1; lAux <= lCalcular; lAux++){

lFactorial *= lAux;//Test Line Console.WriteLine("{0}! * {1}",

lAux, lFactorial);}Console.WriteLine("{0}! es {1}", lCalcular,

lFactorial); }}

Sentencia foreach

La Sentencia foreach es un comando para enumerar los elementos de una colección.

foreach(Tipo indentificador in expresión){}

La variable de iteración es declarada por el Tipo, indentificador y expresión correspondiente a la colección.

La variable de iteración representa el elemento de la colección para cada iteración.

El siguiente ejemplo muestra el uso de for:

using System;class App{

public static void Main(string[] aArgs){for(int i = 0; i < aArgs.Length; i++){

Console.WriteLine("Elemento " + i + " = " + aArgs[i]);

}}

}

El ejemplo anterior implementado con foreach:

using System;class App{

public static void Main(string[] aArgs){foreach(String s in aArgs){

Console.WriteLine(s);}

}}

No es posible asignar un nuevo valor a la variable de iteración. No se puede pasar la variable de iteración como un parámetro ref o out.

Para que una clase soporte la sentencia foreach, la clase debe soportar un método con la firma GetEnumerator() y la estructura, clase o interface que regresa debe tener un método público MoveNext y una propiedad pública Current.

En el siguiente ejemplo el método GetEnvironmentVariables() regresa una interfaz de tipo IDictionary. Es posible acceder a las colecciones Keys y Values de la interfaz IDictionary:

using System;using System.Collections;

class SentenciaForEach{ public static void Main(){

IDictionary VarsAmb = Environment.GetEnvironmentVariables();

Console.WriteLine("Existen {0} variables de ambiente declaradas", VarsAmb.Keys.Count);

foreach(String strIterador in VarsAmb.Keys){Console.WriteLine("{0} = {1}", strIterador,

VarsAmb[strIterador].ToString());}

}}

Nota, es necesario tener una precaución extra al decidir el tipo de variable de iteración, porque un tipo equivocado no puede ser detectado por el compilador, pero si detectado en tiempo de ejecución y causar una excepción.

Sentencia while

La Sentencia while se utiliza cuando no se conoce previamente cuantas veces ha de repetirse un bloque de código, por lo que puede ejecutarse 0 o más veces. Este bloque se repetira mientras la condición evalue una expresión booleana verdadera, no será posible evaluar otro tipo de expresión.

while(condicional){}

Ejemplo:

using System;using System.IO;

class SentenciaWhile{public static void Main(){

if(!File.Exists("test.html")){Console.WriteLine("El archivo test.html

no existe");return;

}StreamReader SR = File.OpenText("test.html");String strLinea = null;while(null != (strLinea = SR.ReadLine())){

Console.WriteLine(strLinea);}SR.Close();

}}

Es posible utilizar la sentencia break para salir del ciclo o continue para saltar una iteración.

Sentencia do

La diferencia entre la sentencia while y do es que do se evalua después de su primer iteración, por lo que al menos siempre se ejecuta una vez:

do{ sentencias;}while(condición);

Es posible salir de un ciclo do a través de la sentencia break y es posible saltar una iteración utilizando la sentencia continue

El siguiente ejemplo le la entrada de la consola toma el primer caracter leido, lo convierte en un Tipo double y suma su valor mientras la entrada sea 's' o hasta que la entrada sea 'n'.

using System;

class Consola{public static void Main(){

Consola LeerDatos = new Consola();LeerDatos.Run();

}public void Run(){

char chContinuar = 's';string strDatos;double dSuma = 0;do{

Console.Write("Proporcione un número: ");

strDatos = Console.ReadLine();dSuma += Double.Parse(strDatos);

Console.Write("¿Continuar s/n?");strDatos = Console.ReadLine();chContinuar = strDatos[0];if(chContinuar == 'n') break;

}while(chContinuar == 's');Console.WriteLine("La suma de los números es: "

+ dSuma);}

}

Sentencias de Salto

Las Sentencias de Salto como break, continue, goto y return sirven para ir de una sentencia a otra

break

La Sentencia break es utilizada para salir de la iteración en curso o sentencia switch y continuar con la ejecución después de esa sentencia.

continue

La Sentencia continue salta todas las sentencias siguientes en la iteración en curso y entonces continua la ejecución en la sentencia de iteración (siguiente iteración).

goto

La Sentencia goto puede ser utilizada para saltar directamente a una etiqueta. Una sentencia goto no puede ser utilizada para saltar adentro de un bloque de sentencias. Su uso podría ser empleado en sentencias switch o para transferir el control fuera de un loop anidado.

Nota, como buena práctica no se recomienda el uso de goto.

return

La Sentencia return regresa a la función invocadora y opcionalmente retorna un valor.

Asignación Definitiva

Las reglas de Asignación definitiva previenen la observación del valor de una variable no asignada, ya que C# no permite utilizar variables que no han sido inicializadas, así como también no pueden realizarse operaciones con variables de clase que no han sido inicializadas.

Puede accederse al elemento de un arreglo aún si no ha sido inicializado, ya que el compilador no puede rastrear la asignación definitiva en todas las situcaciones.

Precedencia de Operadores

Cuando una expresión contiene múltiples operadores, la precedencia de operadores controla el orden en el cual los elementos de la expresión son evaluados.

Categoría Operador

Primary(x), x.y, f(x), a[x], x++, x--, new, typeof, sizeof,

checked, unchecked

Unary +, -, !, ~, ++x, --x, (T)x

Multiplicative *, /, %

Additive +, -

Shift <<, >>

Relational <, >, <=, >=, is

Equality ==, !=

Logical AND &

Logical XOR ^

Logical OR |

Conditional AND

&&

Conditional OR ||

Conditional ?:

Assignment =, *=, /=, %=, +=, -=, <<=, >>=, &=, ^=, |=

typeof

El operador typeof regresa el tipo del objeto, el cual es una instancia de la clase System.Type

Una instancia ya existente puede obtener el tipo de objeto con el método de la instancia GetType().

is

El operador is es utilizado para determinar cuando una referencia a un objeto puede ser converitda a un tipo específico o interface.

El operador as es muy similar al operador is, pero en vez de determinar cuando un objeto es un tipo específico o interface, as también realiza la conversión explicita a ese tipo o interface y si no lo puede convertir el operador regresa null.

Utilizar as es más eficiente que utilizar is, porque as sólo necesita checar el tipo del objeto una vez e is checa el tipo cuando el operador es utilizado y lo checa otra vez cuando la conversión se realiza.

Utilizando is

if(UnObjeto is UnTipo){UnTipo ut = (UnTipo) UnObjeto;

}

Utilizando as

UnTipo ut = UnObjeto as UnTipo;if(ut != null){

sentencias;}

Conversiones

En C# las conversiones se dividen en conversiones explícitas y conversiones implícitas que son aquellas que podrían siempre ocurrir:

//conversiones implícitassbyte a = 55;short b = a;int c = b;long d = c;

//conversiones explícitasc = (int) d;b = (short) c;

a = (sbyte) b;

A continuación se presenta la jerarquía de conversión en C##

Manejo de Excepciones

Las excepciones son el método fundamental de manejo de condiciones de error.

Ejemplo:

using System;class DivisionCero{ public static void Main(){

int iA = 33;int iB = 0;try{ //Sentencia que puede lanzar una excepción Console.WriteLine("{0}/{1} = {2}", iA ,iB, iA/iB);}catch(Exception e){ //Manejo de la excepción Console.WriteLine("La operación {0}/{1} genero la

excepcion : {2}", iA, iB, e);}Console.WriteLine("Continua la ejecución del

código..."); }}

El ejemplo encierra el bloque de código que podría lanzar una excepción con try. En caso de generarse una excepción el runtime .NET detiene la ejecución del código y busca el bloque try en el cual la excepción tuvo lugar, entonces busca si este bloque tiene relacionado un bloque catch, puede ser que encuentre más de un bloque catch relacionado al bloque try que genero la excepción, por lo que se determina que bloque catch es el que mejor y ejecuta el código que contiene.

El compilador de C# puede manejar silenciosamente situaciones que podrían producir un error sin notificarnos explicitamente de ello, por ejemplo una situación como un overflow que es cuando el cálculo de una operación excede el rango válido de resultados posibles para el tipo de dato.

El caso del código para calcular un factorial, el compilador no prodruce una advertencia, pero si trata de obtener el factorial de 2000 dara por resultado 0, el compilador actuo en modo silencioso porque por default el compilador tiene deshabilitada la opción de chequeo de overflow.

Es posible cambiar el comportamiento de chequeo de overflow utilizando un switch al compilar.

Jerarquía de Excepciones

Todas las excepciones derivan de la clase Exception, la cual es parte del lenguaje común en tiempo de ejecución (CLR), donde la propiedad catch determina por coincidencia el tipo de excepción a el nombre de la excepción generada. Un bloque catch con una coincidencia especifica hacen más general la excepción:

using System;class ExceptionDivision0{

public static void Main(){int iA = 33;int iB = 0;try{

Console.WriteLine("{0}/{1} = {2}", iA ,iB, iA/iB);

}catch(DivideByZeroException){Console.WriteLine("Se genero la

excepcion : DivideByZeroException");}Console.WriteLine("Continua la ejecución del

código...");}

}

En este ejemplo el bloque catch que atrapa la excepción DivideByZeroException es una coincidencia más específica, por lo que es la única que será ejecutada, pero si además de escribir el catch para DivideByZeroException escribe el catch para Exception, el compilador le notificara que existe una excepción que atrapa todas las excepciones y esto es porque Exception ocupa la cima de la jerarquía de todas las excepciones.

Trabajar con Excepciones

Existen tres formas básicas de trabajar con excepciones:

Caller Beware

La primer forma es no atrapar la excepción, lo cual provocará dejar al objeto en un estado incorrecto, y causará daños cuando el caller trate de utilizarla de nuevo.

Caller Confuse

La segunda forma es atrapar la excepción y tratar de hacer acciones que dejen la operación como estaba hasta antes de generarse la excepción y entonces relanzar la excepción, esto usualmente es lo menos que se esperaria del manejo de excepciones ya que un objeto debería siempre mantener un estado válido después de generarse una excepción.

Se llama Caller Confuse, porque después de generase una excepción, el caller con frecuencia tiene poca información respecto al entendimiento de los detalles de la excepción o como podría ser solucionada.

Caller Inform

Las tercer forma Caller Inform agrega información que es devuelta al usuario, la excepción atrapada es envuelta en una excepción que tiene información adicional:

using System;class ExcDivZeroInf{

public static void Main(){int iA = 33;int iB = 0;try{

Console.WriteLine("{0}/{1} = {2}", iA ,iB, iA/iB);

}catch(DivideByZeroException e){Console.WriteLine("Se genero la

excepcion : DivideByZeroException");throw(new

DivideByZeroException("Información adicional...", e));}Console.WriteLine("Continua la ejecución del

código...");}

}

Chequeo de Overflow

Si requerimos controlar el chequeo de overflow para la aplicación completa, el compilador de C# debe establecerse como checked. Por default el compilador tiene deshabilitada la opción de chequeo.

Para indicar explicitamente que el compilador cheque el overflow escriba:

csc Factorial.cs /checked+

Una vez que se compilo de con la opción de chequeo de overflow habilitado, al intentar obtener el factorial de 2000 de presenta la ventana Just-In-Time-debbuging notificandonos que ocurrio una excepción en Factorial.exe:

System.OverflowException

Este tipo de situaciones es posible atraparlas y manejarlas a través de las excepciones que se producen.

Chequeo programático de Overflow

Existe otra opción si es que no deseamos activar el Chequeo de Overflow para la aplicación completa y habilitar sólamente partes especificas de código, para ello se utiliza la sentencia checked:

using System;

class FactorialChecked{ public static void Main(string[] aArgs){

if(aArgs.Length == 0){Console.WriteLine("Debe proporcionar un

argumento, Ejemplo: Factorial 5");return;

}

long lFactorial = 1;long lCalcular = Int64.Parse(aArgs[0]);

long lAux = 1;for(lAux = 1; lAux <= lCalcular; lAux++){

checked{lFactorial *= lAux;} //Habilitar chequeo de overflow

//Test Line Console.WriteLine("{0}! * {1}", lAux, lFactorial);

}Console.WriteLine("{0}! es {1}", lCalcular,

lFactorial); }}

También es posible hacer el caso contrario, es decir, indicar que no se realice el chequeo de overflow para partes especificas de código, para ello se utiliza la sentencia:

unchecked{sentencias;}

Sentencias para el Manejo de Excepciones

Es posible atrapar, manejar y limpiar las excepciones que se producen utilizando las sentencias siguientes:

try - catch try - finally try - catch - finally

try - catch

Para evitar que se muestre el mensaje que indica que una excepción ocurrio, es necesario atrapar la excepción y lo mejor de todo es que continue la ejecución del programa, para ello se utiliza try y catch.

try contiene el código que quizá pueda lanzar una excepción y catch maneja la excepción si esta ocurre:

try{//sentencias que pueden lanzar una excepción

}catch(nombreExcepción){//manejo de la excepción

}

El siguiente ejemplo maneja la excepción FileNotFoundException que se produce cuando se intenta manipular un archivo que no existe, si esto ocurre se presenta un mensaje que muestra el nombre del archivo que se intento manipular y no se encontro a través de una propiedad pública de la excepción llamada FileName.

using System;using System.IO;

class SentenciaWhile{public static void Main(){

try{StreamReader SR =

File.OpenText("test.html");String strLinea = null;while(null != (strLinea =

SR.ReadLine())){Console.WriteLine(strLinea);

}SR.Close();

}catch(FileNotFoundException e){//En caso de que el archivo no exista

Console.WriteLine("No se encontro el archivo : " + e.FileName);

return;}

}}

try - finally

Es posible limpiar el manejo de errores utilizando try y el constructor finally, sin eliminar el mensaje de error, pero el código contenido en el bloque finally es ejecutado aún después de ocurrir una excepción.

El siguiente código maneja una variable booleana que indica si se produjo un error, simplemente poniendola dentro del bloque try, si el código contenido fué ejecutado la variable booleana es false lo cual indica que no ocurrieron excepciones, si el bloque no se ejecuto la variable booleana mantiene su valor inicial lo cual significa que si ocurrieron excepciones y entonces se ejecuta el bloque Finally el cual evalua el valor de la variable booleana y presenta la indicación correspondiente.

using System;using System.IO;

class SentenciaTryFinally{public static void Main(){

bool bExcepcion = true;try{

StreamReader SR = File.OpenText("test.html");

String strLinea = null;while(null != (strLinea =

SR.ReadLine())){Console.WriteLine(strLinea);

}SR.Close();bExcepcion = false;

}finally{

if(bExcepcion){Console.WriteLine(">>> No se

encontro el archivo");}else{

Console.WriteLine(">>> No ocurrieron excepciones");

}

}}

}

Note que en caso de no existir el archivo se produce una excepción y se presenta el mensaje que indica que ha ocurrido una excepción pero también fué ejecutado el bloque finally, el código que contiene el bloque finally siempre es ejecutado ocurra o no una excepción.

Puede emplear la sentencia finally para reestablecer los valores previos a la generación de la excepción.

try - catch - finally

Combinar try para controlar el código que puede lanzar excepciones, atrapar la excepción con catch y llevar acabo instrucciones necesarias con finally hacen una mejor solución cuando ocurren las excepciones.

Es posible utilizar una sentencia catch por cualquier excepción que pudiera ocurrir, es decir, tener más de un bloque catch, pero es necesario conocer la jerarquía de las excepciones porque puede ocurrir que un bloque previo catch sea más general y contenga todas las excepciones lo cual produciria un error.

using System;using System.IO;

class SentenciaTryCatchFinally{ public static void Main(){

bool bExcepcion = true;bool bModificacion = false;try{

bModificacion = true;StreamReader SR = File.OpenText("test.htmlX");String strLinea = null;while(null != (strLinea = SR.ReadLine())){

Console.WriteLine(strLinea);}SR.Close();bExcepcion = false;

}catch(FileNotFoundException e){//En caso de que el archivo no exista

Console.WriteLine("No se encontro el archivo : " + e.FileName);

return;}finally{

if(bExcepcion){bModificacion = false;//Valor antes de

generarse la excepciónif(!bModificacion){

Console.WriteLine("Entro en modo modificación, _

pero las modificaciones no se realizaron");

}

Console.WriteLine("Causa : No se encontro el archivo");

}else{Console.WriteLine("No ocurrieron

excepciones");}

} }}

Lanzamiento de Excepciones

Para atrapar una excepción con la sentencia catch primero debe generarse la excepción, pero es posible que a través de codigo se lanze o invoque una excepción:

throw new NombreExcepcion(excepcion);

El poder lanzar o invocar una excepción es util cuando no se ha contemplado cierto escenario o para nuevos escenarios, al crear una clase podrian crearse también excepciones propias de esta clase.

A continuación se presenta una tabla que contiene las excepciones estándar que provee el runtime:

Tipo Descripción

Exception Clase base para todas los objetos exception

SystemException Clase base para todos los errores generados en tiempo de ejecución

IndexOutRangeException Lanzada en tiempo de ejecución cuando el índice de un arreglo está fuera de rango

NullreferenceException Disparada en tiempo de ejecución cuando un objeto null es referenciado

InvalidOperationExceptionLanzada por ciertos métodos cuando invocan a métodos que son inválidos para el estado de los objetos actuales

ArgumentException Clase base de todos los argumentos de las excepciones

ArgumentNullExceptionLanzada por un método, en caso de que un argumento sea null cuando no sea permitido

ArgumentOutOfRangeException

Lanzada por un método cuando un argumento no está en el rango permitido

InteropExceptionClase base para excepciones que son originadas u ocurren en ambientes fuera del CLR

ComException Excepción que contiene información HRESULT COM

SEHException Excepción que encapsula información del

manejo de excepciones destructurada Win32

Relanzamiento de Excepciones

El siguiente código muestra como es posible atrapar una excepción, manejarla y se volverla a invocar:

using System;

class FactorialCheckedReThrow{ public static void Main(string[] aArgs){

if(aArgs.Length == 0){Console.WriteLine("Debe proporcionar un

argumento, Ejemplo: Factorial 5");return;

}

long lFactorial = 1;long lCalcular = Int64.Parse(aArgs[0]);

long lAux = 1;

try{checked{ //Habilitar chequeo de overflow

for(lAux = 1; lAux <= lCalcular; lAux++){lFactorial *= lAux;//Test Line Console.WriteLine("{0}! *

{1}", lAux, lFactorial);}

} }catch(OverflowException){

Console.WriteLine("El factorial {0}! causo una excepción", lCalcular);

throw; } Console.WriteLine("{0}! es {1}", lCalcular, lFactorial); }}

Creación de Clases Exception

Es recomendable utilizar las clases predefinidas para excepciones, para ciertos escenarios es posible crear clases de excepciones apropiadas, por ejemplo cuando creamos una clase, también podemos crear excepciones para esta clase, esto es conveniente cuando se utiliza la clase y manejar posibles escenarios de error con las clases de excepciones creadas.

using System;

public class MiExcepcion:Exception{public MiExcepcion(string str):base(str){}

}

public class AplicMisExcepciones{public static void Probar(){

throw new MiExcepcion("ocurrio un error");}public static void Main(){

try{AplicMisExcepciones.Probar();

}catch(Exception e){Console.WriteLine(e);

}}

}

Se deben tomar ciertas consideraciones al crear excepciones:

Al lanzar una excepción se debe proporcionar un texto significativo Lanzar excepciones solo cuando se presente una condición realmente

excepcional Lanzar un ArgumentException si el método o propiedad envio mal los

parámetros Lanzar un InvalidOperationException cuando la operación invocada no es

apropiada para el estado actual de los objetos Lanzar la excepción más apropiada Usar excepciones encadenadas No utilizar excepciones para errores esperados o normales No usar excepciones para control o flujo normal No lanzar NullReferenceException o IndexOutOfRangeException en

métodos

Componentes

Así como es posible escribir clases y hacer uso de estas en un mismo archivo, también es posible escribir en un archivo (ejecutable) unicamente la clase lo cual es conocido como componente y en otro archivo (también ejecutable) el uso de la clase lo cual es conocido como cliente.

Creación de Componentes

Para crear un componente unicamente es necesario escribir la Clase con todos sus miembros (Constructores, Propiedades, Métodos), almacenarla en un archivo y compilar el componente.

using System;

public class ClsPersona{private int iSueldo;public int Sueldo{

get{return iSueldo;}set{iSueldo = value;}

}

public string sNombre;public void AsignarNombre(string sValor){

sNombre = sValor;}public string ObtenerNombre(){

return sNombre;}

}

Compilación de Componentes

Al compilar un componente se crea una biblioteca y no se crea una aplicación, como es el caso cuando se trabaja en un sólo archivo la clase y la aplicación que hace uso de la clase:

csc /t:library /out:ClsPersona.dll ClsPersona.cs

Si utiliza nombres de espacio:

csc /r:System.nombreBiblioteca.dll /t:library /out:NombreComponente.dll NombreComponente.cs

Donde el switch /t:library indica al compilador de C# crear una biblioteca y no buscar el método estático Main.

Si su clase requirio de nombres de espacio (namespace) es necesario hacer referencia a estas bibliotecas mediante el switch /r:NombreBiblioteca.dll

Recuerde que el switch /out no es obligatorio ya que se utiliza para especificar un nombre distinto al nombre del archivo fuente, aunque es buena práctica especificarlo ya que algunas aplicaciones no sólo tienen un archivo fuente, entonces el compilador podría llamar a la biblioteca con el primer nombre de archivo fuente en la lista.

Una vez que ha compilado su componente puede escribir una Aplicación Cliente.

Creación de una Aplicación Cliente

Para hacer uso de los componentes creados es posible crear aplicaciones cliente donde se creen instancias de las clases creadas:

using System;

class AplicClsPersona{public static void Main(){

ClsPersona Empleado = new ClsPersona();Empleado.Sueldo = 33;Console.WriteLine("Edad : " + Empleado.Sueldo);

Empleado.AsignarNombre("Gerardo Ángeles Nava");Console.WriteLine("Nombre : " +

Empleado.ObtenerNombre());}

}

Compilación de Clientes

Es necesario indicarle al compilador una referencia a la nueva biblioteca de componentes DLL:

csc /r:NombreComponente.dll NombreCliente.cs

Nota para hacer uso de una clase es necesario que tenga el modificador de acceso public.

Namespaces

Los nombres de espacio namespace en el runtime .NET son utilizados para organizar las clases y otros tipos en una estructura jerarquica. El propósito del uso de namespace hacen las clases fáciles de usar y prevenir colisiones con las clases escritas por otros programadores.

Los namespace en C# se utilizan para organizar programas y la jerarquía natural de la organización facilita presentar los elementos de un programa a otros programas. Los namespace son utiles para la organización interna de aplicaciones.

Un namespace contiene tipos que pueden ser utilizados en la construcción de programas: clases, estructuras, enumeraciones, delegados e interfaces, por ejemplo para poder escribir a la consola se utiliza el namespace System.

No es obligatorio jerarquizar los namespace pero es una buena práctica organizar los namespace creados de manera jerarquica para dar claridad a la aplicación.

Los nombres de espacio son definidos utilizando la sentencia:

namespace

Para múltiples niveles de organización los namespaces pueden ser anidados:

namespace NombreNamespaceA{namespace NombreNamespaceB{

class NombreClase{public static void Function(){}

}}

}

El código anterior puede ser simplificado de la siguiente manera:

namespace NombreNamespaceA.NombreNamespaceB{class NombreClase{

public static void Function(){}}

}

Las colisiones entre tipos o nombres de espacio que tienen el mismo nombre se pueden resolver utilizando una variante de la cláusula using que permite definir un alias para la clase:

using Alias = System.Console;class NombreClase{

public static void Main(){

Alias.WriteLine("Alias de una clase");}

}

Envolver Clases en Namespace

Es posible envolver (wrapping) las clases en un namespace, para ello sólo es necesario utilizar la palabra reservada namespace seguida de un nombre que lo identifique y encerrar entre llaves el código que deseamos pertenezca a este.

using NombreOtrosEspacios;namespace NombreEspacio{

public class NombreClase{//propiedades//métodos

}}

Ejemplo:

using System;

namespace informatique.com.mx{public class iPersona{

private int iSueldo;public int Sueldo{

get{return iSueldo;}set{iSueldo = value;}

}

public string sNombre;public void AsignarNombre(string sValor){

sNombre = sValor;}public string ObtenerNombre(){

return sNombre;}

}}

Compilar:

csc /t:library /out:iPersona.dll iPersona.cs

Utilizar Namespace en Aplicaciones Cliente

Al desarrollar componentes utilizando namespace la aplicación cliente debe importarlo:

using NombreEspacio;

Otra posibilidad es hacer una referencia absoluta a los elementos del namespace, aunque para evitar conflictos es preferible utilizar la directiva:

Ejemplo:

using System;using informatique.com.mx;

class iAplicClsPersona{public static void Main(){

iPersona Empleado = new iPersona();Empleado.Sueldo = 33;Console.WriteLine("Edad : " + Empleado.Sueldo);

Empleado.AsignarNombre("Gerardo Ángeles Nava");Console.WriteLine("Nombre : " +

Empleado.ObtenerNombre());}

}

Compilar:

csc /r:iPersona.dll iAplicPersona.cs

Especificar de manera absoluta el namespace:

using System;

class iAplicClsPersonaAbs{public static void Main(){

informatique.com.mx.iPersona Empleado = new informatique.com.mx.iPersona();

Empleado.Sueldo = 33;Console.WriteLine("Edad : " + Empleado.Sueldo);

Empleado.AsignarNombre("Gerardo Ángeles Nava");Console.WriteLine("Nombre : " +

Empleado.ObtenerNombre());}

}

Compilar:

csc /r:iPersonaAbs.dll iAplicPersonaAbs.cs

Agregar Múltiples Clases a Un Namespace

En el punto anterior envolvimos una clase a un namespace, pero es posible agregar y envolver más clases o componentes al mismo namespace, sin importar que esten contenidos en diferentes archivos, después de la compilación son parte del mismo namespace:

csc /t:library /out:NombreComponente.dll archivoFuente1.cs archivoFuente2.cs

Agregando otra clase al namespace informatique.com.mx:

using System;

namespace informatique.com.mx{class iVehiculo{

private int iRueda;private int iPuerta;private int iVentana;private int iHelice;private int iMotor;private int iAsiento;private string sTipo;//Aereo, anfibio,

terrestre, espacial//Constructorpublic iVehiculo(int Rueda, int Puerta, int

Ventana, _int Helice, int Motor, int Asiento, string

Tipo){iRueda = Rueda;iPuerta = Puerta;iVentana = Ventana;iHelice = Helice;iMotor = Motor;iAsiento = Asiento;sTipo = Tipo;

}

public int Ruedas{get{return iRueda;}set{iRueda = value;}

}

public int Puertas{get{return iPuerta;}set{iPuerta = value;}

}

public int Ventanas{get{return iVentana;}set{iVentana = value;}

}

public int Helices{get{return iHelice;}set{iHelice = value;}

}

public int Motores{get{return iMotor;}set{iMotor = value;}

}

public int Asientos{get{return iAsiento;}set{iAsiento = value;}

}

public string Tipo{get{return sTipo;}set{sTipo = value;}

}}

}

Compilar:

csc /t:library /out:informatique.com.mx.dll iPersona.cs iVehiculo.cs

Aplicación Cliente:

using System;using informatique.com.mx;class iAplic{

public static void Main(){iPersona Empleado = new iPersona();Empleado.Sueldo = 33;Console.WriteLine("Edad : " + Empleado.Sueldo);

Empleado.AsignarNombre("Gerardo Ángeles Nava");Console.WriteLine("Nombre : " +

Empleado.ObtenerNombre());

//Clase que está contenida en otro archivoiVehiculo MiAvion = new

iVehiculo(2,1,100,0,3,200,"Aereo");Console.WriteLine("Ruedas : " +

MiAvion.Ruedas);Console.WriteLine("Puertas : " +

MiAvion.Puertas);Console.WriteLine("Ventanas : " +

MiAvion.Ventanas);Console.WriteLine("Helices : " +

MiAvion.Helices);Console.WriteLine("Motores : " +

MiAvion.Motores);Console.WriteLine("Asientos : " +

MiAvion.Asientos);Console.WriteLine("Tipo : " +

MiAvion.Tipo);}

}

Compilar:

csc /r:informatique.com.mx.dll iAplic.cs

Recuerde que sus clases deben tener el modificador de acceso public, de lo contrario el compilador notificara un error (error CS0122: is inaccessible due to its protection level), por lo que tendrá que agregar el modificador de acceso y volver a compilar.

Namespace y Ensambles

Un objeto puede ser utilizado desde un archivo fuente C# sólo si ese objeto puede ser localizado por el compilador C#, por default el compilador sólo abre el ensamble conocido como mscorlib.dll, el cual contiene las funciones principales para el CLR.

Para referenciar objetos localizados en otros ensambles, el nombre del archivo de ensamble debe ser pasado al compilador, esto es posible utilizando un switch al compilar:

/r:nombreEnsamble

Es así como se crea un correlación entre el namespace de un objeto y el nombre del ensamble en el cual reside, por ejemplo los tipos de namespace en el System.Net residen en el ensamble System.Net.dll

Compilación Condicional

La Compilación Condicional permite excluir o incluir código, en C# existen dos formas de hacer esto:

1. Uso del Preprocesador 2. Atributo conditional

Uso del Preprocesador

C# el compilador emula el preprocesador, ya que no hay un preprocesador por separado.

El compilador de C# no soporta macros, en cambio soporta las siguientes directivas:

Definición de símbolos Exclusión de código basado en símbolos Lanzamiento de errores y advertencias

Definición de símbolos

La Definición de símbolos es utilizada para excluir o incluir código dependiendo si son o no son definidos ciertos símbolos.

Una forma para definir un símbolo es utilizando la directiva #define en un archivo fuente C#, está definición deberá realizarse antes de cualquier otra sentencia:

#define DEBUG#define RELEASE

En este caso #define DEBUG, define un símbolo DEBUG y su ámbito es el archivo donde es definido, al igual que el símbolo RELEASE.

Otra forma utilizada para definir símbolos es usar el compilador y es de ámbito global para todos los archivos:

csc /define:DEBUG nombreArchivo.cs

Si se requiere definir múltiples símbolos utilizando el compilador, es necesario separar cada símbolo con una coma (,)

csc /define:DEBUG,RELEASE,DEMOVERSION nombreArchivo.cs

Si el código fuente incluye directivas de definición de símbolos, es posible deshabilitarlas utilizando la directiva #undef cuyo ámbito también corresponde al archivo donde es definida:

#undef DEBUG

Exclusión de código basado en símbolos

El principal propósito de los símbolos es la inclusión o exclusión condicional del código, basado sobre si son o no son definidos los símbolos.

El siguiente código no define símbolos en el archivo fuente:

.sentencia;.#if NOMBRE_SIMBOLO

sentencia;#else

sentencia;#endif.

Pero es posible definir o no los símbolos al compilar la aplicación:

csc /define:NOMBRE_SIMBOLO NombreAplicacion.cs

Las directivas del preprocesador emulado utilizadas para evaluar el símbolo son: #if, #else y #endif las cuales actuan como su contraparte, la sentencia condicional if C#, es posible utilizar &&, || y !:

//#define SIMBOLO_A#define SIMBOLO_B#define SIMBOLO_C

#if SIMBOLO_A#undef SIMBOLO_C

#endif

using System;

class NombreClase{public static void Main(){

#if SIMBOLO_A.

#elif SIMBOLO_B && SIMBOLO_C.

#else.

#endif}

}

Lanzamiento de errores y advertencias

Existe otro uso de las directivas del preprocesador para lanzar errores del compilador o advertencias dependiendo de ciertos símbolos, para ello se utilizan las directivas:

#warning #error

Por ejemplo

#if SIMBOLO_ERROR#error Presentar el mensaje de error correspondiente

#endif.#if SIMBOLO_WARNING

#error Presentar el mensaje de advertencia correspondiente

#endif

Atributo conditional

Un atributo conditional evalua la invocación de una función cuando sierto símbolo es definido y evalua a nada cuando una versión liberada es construida.

Un atributo conditional debe tener un tipo void de regreso, cualquier otro tipo de regreso no es permitido.

.[conditional("NOMBRE_SIMBOLO")]

método A[conditional("NOMBRE_SIMBOLO")]

método B.

Comentarios de Documentación en XML

Es posible construir automáticamente la Documentación utilizando comentarios en el código.

La salida que es generada por el compilador es XML puro y puede ser utilizada como entrada para la documentación de un componente.

La documentación es una parte extremadamente importante del software y en especial de los componentes por ser utilizados por otros desarrolladores.

Elementos XML

Nota: todo comentario de documentación son tags XML (eXtensible Markup Language).

Para describir un elemento se utiliza el tag <summary></summary>, el cual se escribe en el código fuente anteponiendo tres diagonales que son indicativo de un comentario de documentación:

///<summary>Descripción...</summary>

En caso de requerir más una línea para el comentario de documentación utilice el tag:

///<para>

///.

///.///</para>

En caso de requerir una referencia a otros elementos utilice el tag:

///<see cref="NombreElemento"/>

En caso de requerir una referencia a un tópico de interes utilice:

///<seealso cref="System.Net"/>

Un tag contrario a summary, para un volumen mayor de documentación es:

///<remarks>

Es posible incluir listas utilizando los tags :

///<list type="bullet">/// <item>Constructor/// <see cref="Constructor()"/>

/// <see cref="Constructor(string)"/>/// </item>///</list>

Para describir parámetros se utiliza el tag:

///<paramref name="nombreParametro"/>

Es posible encerrar en un tag un ejemplo completo e incluir la descripción y código:

///<example>/// ./// <code>

/// ./// </code>/// .///</example>

Para describir los parámetros de regreso utilice:

///<returns>

/// <para>true: valor obtenido</para>/// <para>false: valor no obtenido</para>///</returns>

Para describir propiedades de clase se utiliza un tag especial:

///<value>Propiedad...</value>

Una vez que el proceso de documentación para un componente es terminado, es posible crear un archivo XML basado en la documentación descrita en el código fuente y

hacerla disponible a quienes utilicen el componente, para ello simplemente se utiliza al compilar el switch /doc: seguido del documento XML.

csc /doc:Persona.xml AplicPersona.cc

Ejemplo:

using System; /// /// Clase Persona /// Autor : Gerardo Ángeles Nava /// Fecha : 10/09/2005

/// Descripción : Clase que define lo que es y puede hacer una persona /// /// class Persona{

///La propiedad iSueldo se emplea para obtener y asignar el valor del sueldo de una persona

private int iSueldo;public int Sueldo{

get{return iSueldo;}set{iSueldo = value;}

}

public string sNombre;///Utilizado para asignar el valor de la propiedad sNombre

public void AsignarNombre(string sValor){sNombre = sValor;

}public string ObtenerNombre(){

return sNombre;}

}

class AplicPersona{public static void Main(){

Persona Empleado = new Persona();Empleado.Sueldo = 33;Console.WriteLine("Edad : " + Empleado.Sueldo);

Empleado.AsignarNombre("Gerardo Ángeles Nava");Console.WriteLine("Nombre : "

+Empleado.ObtenerNombre());}

}

Salida: para ver el documento XML generado de clic aquí. El compilador realizará validación sobre los tags XML en el archivo fuente, en caso de existir errores el compilador lo notificará y aún así el documento XML es generado pero tendrá un mensaje de error.

El documento XML tendrá algunos identificadores seguidos de dos puntos (:) y la ruta del namespace, los cuales por ejemplo tienen los siguiente significados.

N, denota un namespace T, identifica un tipo, el cual puede ser una clase, interface, estructura,

enumeración o delegado F, describe un campo o clase P, se refiere a una propiedad la cual también puede ser un indíce o propiedad

índice. M, identifica un método, incluyendo constructores y operadores. E, denota eventos !, denota un error el cual provee información acerca de una liga que el

compilador C# no pudo resolver.

Si un elemento tiene períodos en su nombre, estos son reemplazados por el símbolo #. Los parámetros para métodos son encerrados entre paréntesis y separados por comas (,).

Componentes .NET

El compilador de C# por default siempre crea componentes .NET para los ejecutables.

Un Componente .NET es la unidad fundamental reusable y compartida en el CLR, un componente .NET también es limitante para asegurar la seguridad, permite la distribución de clases y resolución de tipos. Una aplicación puede contener múltiples componentes .NET

Un componente .NET contiene cuatro partes referentes al número de versión llamado versión compatible:

major version.minor version.build number.revision

La versión compatible es utilizada por el class loader para decidir cual es la versión del componente .NET que cargará, en caso de existir diferentes versiones.

Se considera una versión incompatible cuando major version.minor version es diferente de la versión solicitada.

Se podría considerar una versión compatible cuando el build number es diferente a la versión solicitada.

Se considera una QFE (Quick Fix Engineering) compatible cuando revision es diferente.

Además del número de versión (versión compatible) se almacena otro número en el componente llamado informational version, el cual es considerado sólo para propósitos de documentación y su contenido podría ser SuperControl Build 1880, el contenido representa algo humano y no para la máquina.

Para indicar al compilador que agregue un version information al componente se utiliza el switch:

csc /a.version:1.0.1.0 /t:library /out:nombreArchivoFuente.dll nombreArchivoFuente.cs

El switch /a.version crea una biblioteca con el version information 1.0.1.0, esto puede comprobarse en las propiedades del archivo.dll.

Componentes .NET Privados

Al ligar una aplicación a un componente .NET utilizando el switch /reference:nombreBiblioteca la información de dependencia registra las herramientas de desarrollo, incluyendo la versión de las bibliotecas ligadas, este registro se hace en un manifiesto y el CLR los números de versión contenidos para cargar la versión apropiada de un componente .NET dependiente en tiempo de ejecución.

Cualquier componente .NET que reside en el directorio de la aplicación es considerado privado y no es version-checked

Componentes .NET Compartidos

Si se requiere construir software que se comparta con otras aplicaciones, el componente .NET deberá ser instalado como compartido.

Interoperabilidad COM

COM es una técnica de interoperabilidad, por lo que los clientes .NET deberán ser capaces de invocar componentes COM y componentes COM deberán hacer uso de los nuevos componentes .NET, esta es una característica de iteroperabilidad proporcionada por la plataforma .NET para todos los lenguajes de programación que emiten código administrado.

Uso de Componentes .NET en Componentes COM

La interoperabilidad permite a clientes COM utilizar componentes .NET, para hacer esto posible en COM primero es necesario registrar un objeto antes de poder ser utilizado, para registrar un objeto COM se utiliza la aplicación regsvr32 y para registrar un componente .NET se utiliza regasm.exe, esta herramienta permite registrar un componente .NET en el Registry y también crear un archivo Registry.

Si requiere examinar las entradas agregadas al Registry escriba en la línea de comandos:

regasm nombreComponente.dll /regfile:nombreArchivoComponente.reg

Ahora puede examinar el archivo generado nombreArchivoComponente.reg.

Nota asegurese de que el directorio en el que se encuentra exista el archivo .dll o escriba la ruta completa de su ubicación.

Ejemplo:

REGEDIT4

[HKEY_CLASSES_ROOTinformatique.com.mx.iPersona]@="informatique.com.mx.iPersona"

[HKEY_CLASSES_ROOTinformatique.com.mx.iPersonaCLSID]@="{37504224-213A-3943-845A-E572758E4174}"

[HKEY_CLASSES_ROOTCLSID{37504224-213A-3943-845A-E572758E4174}]@="informatique.com.mx.iPersona"

[HKEY_CLASSES_ROOTCLSID{37504224-213A-3943-845A-E572758E4174}InprocServer32]

@="mscoree.dll""ThreadingModel"="Both""Class"="informatique.com.mx.iPersona""Assembly"="iPersona, Version=0.0.0.0, Culture=neutral,

PublicKeyToken=null""RuntimeVersion"="v1.1.4322"

[HKEY_CLASSES_ROOTCLSID{37504224-213A-3943-845A-E572758E4174}InprocServer32?.0.0.0]

"Class"="informatique.com.mx.iPersona""Assembly"="iPersona, Version=0.0.0.0, Culture=neutral,

PublicKeyToken=null""RuntimeVersion"="v1.1.4322"

[HKEY_CLASSES_ROOTCLSID{37504224-213A-3943-845A-E572758E4174}ProgId]

@="informatique.com.mx.iPersona"

[HKEY_CLASSES_ROOTCLSID{37504224-213A-3943-845A-E572758E4174}Implemented Categories_

{62C8FE65-4EBB-45E7-B440-6E39B2CDBF29}]

El motor de ejecución mscoree.dll es invocado cuando una instancia del objeto (componente registrado) es requerida, más no la biblioteca por si sóla.

El motor de ejecución es responsable de proveer la CCW (COM Callable Wrapper) al objeto.

Una vez registrado el componente puede ser utilizado por lenguajes de programación que soporten esta vinculación, también es posible emplear la utileria tlbexp la cual permite generar una biblioteca tipo para el componente .NET

tlbexp nombreComponente.dll /out:nombreBiblioteca.tlb

Esta biblioteca tipo puede ser utilizada en lenguajes de programación que soporten esta vinculación.

El Componente .NET y todas las clases ya están registradas y se tiene una biblioteca tipo para ambientes

Uso de Componentes COM en Componentes .NET

Los Clientes .NET pueden interoperar con objetos clásicos COM, para que un componente utilise COM debe tener una biblioteca tipo para el CLR esto se traduce a los metadatos que son almacenados con los tipos.

Para que sea posible invocar un componente COM desde un objeto .NET, es necesario envolver el código unsafe, cuando la envoltura o wrapper es invocada, un RCW (Runtime Callable Wrapper) es construido desde la información de la biblioteca tipo. Una herramienta genera el código wrapper basado en la información obtenida de la biblioteca tipo.

La herramienta a utilizar es tlimp (type library import):

tlbimp nombreComponente.dll /out:nombreBiblioteca.dll

Esta herramienta importa el tipo de biblioteca COM, crea y almacena un RCW que puede ser utilizado en el CLR en el archivo nombreBiblioteca.dll.

Para ver los metadatos para el RCW utilice ildasm.exe, así podrá distinguir el nombre de la clase que fué generada para el objeto COM original, esta información es una ayuda para poder escribir el objeto .NET que utiliza el componente COM.

Invocación de Servicios

Se se requiere invocar una función provista por el WIN32 o alguna DLL unmanaged, se utilizan los Servicios de invocación de plataforma (PInvoke).

PInvoke se encarga de ejecutar la función correcta y también de la colocación de los argumentos para y desde sus contrapartes unmanaged.

Simplemente utilice el atributo sysimport al definir un método externo:

[sysimport(dll = nombreDLL,name = puntoEntrada,cgarset = conjuntoCaracteres

]

Unicamente el argumento dll es obligatorio y los demás opcionales, aunque si se omite el atributo name, el nombre de la función de implementación externa debe coincidir con el nombre del método estático interno.

Código No Seguro

Si requiere de escribir código no seguro, deberá utilizar dos palabras reservadas:

unsafe, denota un contexto no seguro, cuando requiera realizar acciones no seguras se debe envolver el código correspondiente con este modificador, el cual puede ser aplicado a constructores, métodos y propiedades.

fixed, al declarar una variable con este modificador previene al recolector de basura de reacomodarlo.

Debugging

El SDK .NET incorpora dos herramientas de depuración de errores:

1. CORDBG, depurador de línea de comando2. SDK, depurador UI

o El depurador SDK no soporta la depuración de código nativo, sólo es posible depurar código administrado.

o No es posible la depuración de una máquina remotao Window register y disassembly aunque se implementan no son

funcionales

Antes de depurar el código de una aplicación es necesario crear una versión depurada, la cual contiene información de depuración no optimizada y un archivo adicional PDB (program database) para depuración y un estado de información del proyecto es creado.

Para crear una versión depurada son necesarios dos switches al compilar:

csc /optimize- /debug+ nombreArchivoFuente.cs

Estos comandos utilizados al compilar crea dos archivos:

nombreArchivoFuente.exe y

nombreArchivoFuente.pdb

Para configurar la sesión de depuración es necesario seleccionar la aplicación que se desea depurar y comenzar el depurador SDK ejecutando dbgurt.exe, el cual esta almacenado en el directorio ProgramFilesNGWSSDKGuiDebug

Una vez que la aplicación depuradora comienza se selecciona el programa que se desea depurar en donde será también posible especificar argumentos en la línea de comandos, mismos que son pasados a la aplicación cuando la sesión de depuración inicia.

Es posible establecer diferentes tipos de breakpoint:

File, interrumpe la ejecución cuando una ubicación específica en el archivo fuente se alcanza

Data, interrumpe la ejecución cuando una variable cambia a un valor especifico Function, interrumpe la ejecución en una ubicación específica dentro de una

función específica Address, interrumpe la ejecución cuando una dirección de memoria específica

se alcanza

Una vez que se interrumpe la ejecución, es posible continuarla utilizando los comandos:

Step Over Step Into Step Out Run to Cursor

Es posible modificar valores de variables simplemente dando doble clic en la columna valor de aquella variable que se desea modificar, así como también es posible observar

las variables, para ello es necesario dar clic en la columna nombre y escribir el nombre de las variables que se desean observar.

Las excepciones son un punto excelente de comienzo para una sesión de depuración, cuando una excepción no es controlada apropiadamente por el código se muestra la ventana de depuración llamada JIT just in time.

Seguridad

Hoy en día el código viene de distintas fuentes, no solo el que es instalado via un setup por el servidor, también puede ser instalado via una página web o correo electrónico.

.NET plantea dos posibles soluciones para la seguridad:

1. Seguridad de acceso al código 2. Seguridad basada en roles

Seguridad de acceso al código

La Seguridad de acceso al código controla el acceso protegiendo los recursos y operaciones. El código es confiable en distintos grados, dependiendo su identidad y de donde viene.

Funciones de la seguridad de acceso al código:

El administrador puede definir las políticas de seguridad asignando ciertos permisos para definir grupos de código.

El código puede requerir que quien invoca (caller) debe tener permisos especificos

La ejecución de código está restringido en tiempo de ejecución, realizando chequeos para verificar que los permisos otorgados a quien invoca (caller) coincidan con el permiso requerido para la operación.

El código puede requerir los permisos necesarios de ejecución y los permisos que podrían ser utilizados, es decir, verificar los permisos indispensables.

Los permisos son definidos para representar ciertos derechos para acceder a distintos recursos del sistema.

La seguridad de acceso al código otorga permisos cuando un componente es cargado, este otorgamiento esta basado en el requerimiento del código, definiendo operaciones permitidas por las políticas de seguridad.

Existen dos puntos importantes de la seguridad de acceso al código, donde el requerimiento mínimo para beneficiarse de la seguridad de acceso al código es para generar un código de tipo seguro.

1. Verificar el tipo de seguridad del código administrado, el runtime forza la restricción de seguridad del código administrado, para determinar cuando el código es seguro. Es importante que el runtime sea capaz de checar los permisos de quien invoca de manera confiable, evadiendo hoyos de seguridad que son creados cuando código menos confiable invoca código altamente confiable, para

ello el código administrado debe ser verificado como tipo seguro. Cada acceso a tipos se realiza sólo en un sentido permitido.

El código C# es de tipo no seguro, pero el IL y los metadatos son inspeccionados antes de dar el visto bueno del tipo de seguridad del código.

2. Permisos que son requeridos por el código, el beneficio de activar el requerimiento de permisos es conocer cuando se tiene el permiso apropiado para realizar acciones y cuando no. Es posible prevenir al código de el otorgamiento de permisos adicionales que no son necesarios. Los permisos mínimos garantizan que el código se ejecute con los recursos justos cuando el código requiere de muchos permisos sin que falle.

La categoria de los permisos es:

Required, permiso que el código necesita para ejecutarse correctamente. Optional, permisos que no son obligatorios para la ejecución correcta del

código, pero que podría ser bueno tenerlos. Refused, permiso que se necesita para que el código nunca se otorgue, aunque la

política de seguridad lo permita, se utiliza para restringir vulnerabilidades potenciales.

Permisos Estándar

Los Permisos Estándar son:

EnvironmentPermission, clase que define permisos de acceso a variables de ambiente, donde son posibles dos tipos de acceso, de sólo lectura y escritura al valor de una variable de ambiente. El tipo de acceso escritura incluye permisos para crear y eliminar variables de ambiente.

FileDialogPermission, controla el acceso a archivos basado en el sistema de archivos de diálogo. El usuario debe autorizar el acceso al archivo via el cuadro de diálogo.

FileIOPermission, es posible especificar tres tipos de acceso a archivos de entrada y salida: lectura, escritura y adición, el acceso lectura incluye acceder a la información del archivo, el tipo escritura incluye eliminar y sobreescribir, el acceso adición no permite leer otros bits.

IsolatedStoragePermission, controla el acceso a almacenamientos aislados, este acceso permite utilización, tamaño de almacenamiento, tiempo de expiración y almacenamiento de datos.

ReflectionPermission, controla la capacidad de leer el tipo de información de tipos miembro no públicos y controla el uso de Reflection.Emit

RegistryPermission, Control de lectura, creación y escritura en el registry SecurityPermission, colección de permisos simples que son utilizados por el

sistema de seguridad, es posible controlar la ejecución de código, sobreescritura de chequeos de seguridad, invocación de código no administrado, serialización, etc.

UIPermission, define el acceso a varios aspectos de la interfaz de usuario, incluyendo el uso de windows, acceso a eventos y uso del portapapeles.

Permisos Identidad

Los Permisos Identidad son:

PubilsherIdentityPermission, la firma de componentes .NET provee resistencia de software publisher

StrongNameIdentityPermission, define el nombre del componente criptograficamente, ya que el nombre compromete la identidad.

ZoneIdentityPermission, define la zona de donde el código tiene origen, un URL puede pertenecer a sólo una zona

SiteIdentityPermission, permisos derivados basados en el sitio web de donde el código tiene origen

URLIdentityPermission, permisos derivados basados en URL de donde el código tiene origen

Seguridad basada en roles

La Seguridad basada en roles representa a un usuario o agente que actua en representación de un usuario dado. Las aplicaciones .NET hacen decisiones basadas en la identidad principal o su role como miembro.

Un role es un nombre para un conjunto de usuarios quienes comparten los mismos privilegios.

Un principal puede ser un miembro de múltiples roles y de esta manera se puede utilizar un role para determinar si ciertas acciones requeridas quizá sean realizadas por un principal.

Un principal no necesariamente es un usuario, también puede ser un agente.

Existen tres tipos de principal:

1. Generic principals, representa usuarios no autentificados. 2. Windows principals, relación de usuarios windows y sus roles, el acceso a

recursos de otro usuario es permitido. 3. Custom principals, definido por una aplicación. Pueden extender la noción

básica de la identidad y los roles del principal. La restricción es que la aplicación debe proveer un módulo de autentificación de los tipos que el principal puede implementar.

La clase Principalpermission provee consistencia con la seguridad de acceso, permitiendo al runtime realizar la autorización en un sentido similar al chequeo de la seguridad de acceso al código, pero es posible acceder directamente a la información de identidad principal y realizar chequeos de role e identidad en el código cuando sea necesario.

Función ToString()

Analice el siguiente ejemplo:

using System;class Empleado{

string usr;string pwd;public Empleado(string login, string pwd){

this.usr = login;this.pwd = pwd;

}}class App{

public static void Main(){Empleado empleado = new

Empleado("gangeles","123");Console.WriteLine("Empleado : " + empleado);

}}

Salida: Empleado : Empleado

La salida fue el nombre de la clase Empleado ya que es la representación más cercana que encontro.

Es posible especificar algo con mayor sentido para ello se necesita redefinir la función ToString():

using System;class Empleado{

string usr;string pwd;public Empleado(string login, string pwd){

this.usr = login;this.pwd = pwd;

}public override string ToString(){

return("Usuario : " + usr + ", Password : " + pwd);

}}class App{

public static void Main(){Empleado empleado = new

Empleado("gangeles","123");Console.WriteLine(empleado);

}}

Salida: Usuario : gangeles, Password : 123

Función Equals()

La función Equals() es utilizada para determinar cuando dos objetos tienen el mismo contenido.

En el siguiente ejemplo se redefinen las funciones operator==() y operator!=(), para permitir la sintaxis del operador, estos operadores deben ser redefinidos en pares, no pueden ser redefinidos separadamente.

Ejemplo:

using System;class Empleado{

string usr;string pwd;public Empleado(string login, string pwd){

this.usr = login;this.pwd = pwd;

}public override string ToString(){

return("Usuario : " + usr + ", Password : " + pwd);

}public override bool Equals(object o){

Empleado empB = (Empleado)o;if(usr != empB.usr){return false;}if(pwd != empB.pwd){return false;}return true;

}public static bool operator==(Empleado empA, Empleado

empB){return empA.Equals(empB);

}public static bool operator!=(Empleado empA, Empleado

empB){return !empA.Equals(empB);

}}class App{ public static void Main(){

Empleado empleado1 = new Empleado("gangeles","123");Empleado empleado2 = new Empleado("gangeles","123");Console.WriteLine("El empleado1 es igual al empleado2:

"+empleado1.Equals(empleado2));Console.Write("empleado1 == empleado2 : ");Console.Write(empleado1 == empleado2);

}}

Salida:

El empleado1 es igual al empleado2 : Trueempleado1 == empleado2 : True

Al compilar el ejemplo anterior se presentara un warning indicando que no fue redefinada la función GetHashCode() ya que los valores que regresa son requeridos para ser relacionados al valor de regreso de Equals(). Cuando se invoca la función Equals() y dos objetos son iguales siempre se debe regresar el mismo código hash.

Si no es redefinido el código hash podría ser sólo identico para la misma instancia de un objeto y una búsqueda para un objeto que es igual pero no la misma instancia podría fallar.

Es posible utilizar un miembro que es único para el código hash, pero si no existe un valor único el código hash debería ser creado fuera de los valores contenidos en la función.

Si la clase no tiene un identificador único pero tiene tiene otros campos, podrías ser utilizados por la función hash:

using System;class Empleado{

string usr;string pwd;public Empleado(string login, string pwd){

this.usr = login;this.pwd = pwd;

}public override string ToString(){

return("Usuario : " + usr + ", Password : " + pwd);

}public override bool Equals(object o){

Empleado empB = (Empleado)o;if(usr != empB.usr){return false;}if(pwd != empB.pwd){return false;}return true;

}public static bool operator==(Empleado empA, Empleado

empB){return empA.Equals(empB);

}public static bool operator!=(Empleado empA, Empleado

empB){return !empA.Equals(empB);

}public override int GetHashCode(){

return usr.GetHashCode() + pwd.GetHashCode();}

}class App{ public static void Main(){

Empleado empleado1 = new Empleado("gangeles","123");Empleado empleado2 = new Empleado("gangeles","123");Console.WriteLine("El empleado1 es igual al empleado2:

"+empleado1.Equals(empleado2));Console.Write("empleado1 == empleado2 : ");Console.Write(empleado1 == empleado2);

}}

La implementación del código GetHashCode anterior agrega los elementos y los regresa.

Clase Hashtable

La clase Hashtable es muy utilizada para realizar una búsqueda de objetos por una llave. Una tabla hash trabaja utilizando una función hash, la cual produce un entero llave para una instancia específica de una clase, donde esta llave es una versión condensada de la instancia.

Una tabla hash utiliza esta llave para limitar drasticamente el número de objetos que deben ser buscados para encontrar un objeto específico en una colección de objetos.

Interface IHashCodeProvider

Si requiere definir diferentes códigos hash para un objeto específico, podría hacer esto implementado la Interface IHashCodeProvider para proveer una función alterna hash y además de que se requiere una coincidencia de la implementación de IComparer, estas nuevas implementaciones son pasadas al contructor de la Hashtable:

using System;using System.Collections;public class Lenguaje : IComparable{

public string nombre;int id;public Lenguaje(string nombre, int id){

this.nombre = nombre;this.id = id;

}

int IComparable.CompareTo(object o){Lenguaje lenguajeB = (Lenguaje)o;if(this.id > lenguajeB.id){return 1;}if(this.id < lenguajeB.id){

return -1;}else{

return 0;}

}

public override string ToString(){return nombre + " " + id;

}

public override int GetHashCode(){return id;

}

public static IComparer OrdenaPorNombre{get{

return (IComparer) new OrdenaNombres();}

}

public static IHashCodeProvider HashNombre{get{

return (IHashCodeProvider) new HashNombreCls();

}}

public class OrdenaNombres : IComparer{public int Compare(object oA, object oB){

Lenguaje lenA = (Lenguaje)oA;Lenguaje lenB = (Lenguaje)oB;return

String.Compare(lenA.nombre,lenB.nombre);}

}}

class HashNombreCls : IHashCodeProvider{public int GetHashCode(object o){

Lenguaje len = (Lenguaje)o;return len.nombre.GetHashCode();

}}

class App{ public static void Main(){

Lenguaje[] aLenguaje = new Lenguaje[5];aLenguaje[0] = new Lenguaje("C",3);aLenguaje[1] = new Lenguaje("ActionScript",5);aLenguaje[2] = new Lenguaje("JavaScript",2);aLenguaje[3] = new Lenguaje("Java",8);aLenguaje[4] = new Lenguaje("PHP",1);

Hashtable lenguajes = new Hashtable(Lenguaje.HashNombre, Lenguaje.OrdenaPorNombre);

lenguajes.Add(aLenguaje[0], "zxc");lenguajes.Add(aLenguaje[1], "bnm");lenguajes.Add(aLenguaje[2], "sdf");lenguajes.Add(aLenguaje[3], "wer");lenguajes.Add(aLenguaje[4], "tgh");

Lenguaje clone = new Lenguaje("MiLenguaje", 12345);string s = (string) lenguajes[clone];Console.WriteLine(clone.ToString(), s);

}}

Función IClonable

La función object.MemberWiseClone() puede ser utilizada para crear un clon de un objeto. La implementación por default de esta función produce una copia de un objeto, los campos de un objeto son copiados exactamente en lugar de ser duplicados:

using System;

class Saludo{public string s;public Saludo(string s){

this.s = s;}

}

class MiClase{public Saludo saludo;public MiClase(string s){this.saludo = new Saludo(s);}public MiClase Clon(){return

(MiClase)MemberwiseClone();}}

class App{ public static void Main(){

MiClase miClase = new MiClase("Hello World!");MiClase miClon = miClase.Clon();Console.WriteLine("miClase : " + miClase.saludo.s);Console.WriteLine("miClon : " + miClon.saludo.s);

miClon.saludo.s = "Hola Mundo";Console.WriteLine("miClase : " + miClase.saludo.s);Console.WriteLine("miClon : " + miClon.saludo.s);

}}

Salida:

miClase : Hello World!miClon : Hello World!miClase : Hola MundomiClon : Hola Mundo

El resultado anterior es porque la copia hecha por la función MemberWiseClonre() es una copia, el valor de saludo es el mismo en ambos objetos por lo que se se cambia un valor dentro del objeto Saludo afecta ambas instancias de MiClase.

Interface ICloneable

Para crear una copia deep, donde una nueva instancia de Saludo es creada para para la nueva instancia de MiClase, para ello se hace una implementación de la interface ICloneable:

using System;

class Saludo{public string s;public Saludo(string s){

this.s = s;}

}

class MiClase : ICloneable{public Saludo saludo;public MiClase(string s){this.saludo = new Saludo(s);}public object Clone(){return (new

MiClase(this.saludo.s));}}

class App{public static void Main(){

MiClase miClase = new MiClase("Hello World!");MiClase miClon = (MiClase) miClase.Clone();Console.WriteLine("miClase : " +

miClase.saludo.s);Console.WriteLine("miClon : " +

miClon.saludo.s);miClon.saludo.s = "Hola Mundo!";Console.WriteLine("miClase : " +

miClase.saludo.s);Console.WriteLine("miClon : " +

miClon.saludo.s);}

}

Salida:

miClase : Hello World!miClon : Hello World!miClase : Hello World!miClon : Hola Mundo

La invocación a Memberwiseclone() regresa una nueva instancia de Saludo y su contenido puede ser modificado sin afectar el contenido de miClase.

Note que en este caso ICloneable requiere implementar la función Clone().

Formato Numérico

Los tipos numéricos son formateados a través de la función miembro Format() del tipo de dato, la cual puede ser invocada directamente a través de String.Format() la cual invoca a la función Format() de cada tipo de dato o Console.WriteLine() la cual invoca a String.Format().

Existen dos tipos de métodos para el formateo específico numérico:

Formato Estándar String

Formato Estándar String, el cual puede ser utilizado para convertir un tipo numérico a una representación específica string.

Este formato consiste del formato específico del caracter seguido de la secuencia de precisión específica de digitos, los formatos soportados son:

Formato

Descripción

Ejemplo Salida

C, cCurrency

Console.WriteLine("0:C", 123.8977);

$123,345.90

D, dDecimal

Console.WriteLine("0:D7", 12345);

0012345

E, e

Scientific (exponential)

Console.WriteLine("0:E", 33345.8977);

3.334590E+004

E, fFixed-point

Console.WriteLine("0:F", 33345.8977);

3.334590E+004

G, g GeneralConsole.WriteLine("0:G", 33345.8977);

33345.8977

N, nNumber

Console.WriteLine("0:N", 33345.8977);

33,345.90

X, xHexadecimal

Console.WriteLine("0:X", 255); FF

Formato Personalizado String

El Formato Personalizado String, son utilizados para obtener más control, sobre la conversación que está disponible a través del formato estándar de strings.

Reemplazo de Cero o Digito

Console.WriteLine("{0:000}",12); Salida: 012

Reemplazo de Espacio o Digito

Console.WriteLine("{0:#####}",123); Salida: 123

Punto Decimal

Console.WriteLine("{0:#####.000}",12345.2); Salida: 12345.200

Separador de Grupo

Console.WriteLine("{0:##,###}",1123456789); Salida: 1,123,456,789

Separador de Grupo

Console.WriteLine("{0:000,.##}",12394); Salida: 123.95

Porcentaje

Console.WriteLine("{0:##.000%}",98144); Salida: 98.144%

Notación Exponencial

Console.WriteLine("{0:###.000E-00}",3.1415533E+04); Salida: 314.155E-02

Separador de Sección

Console.WriteLine("{0:###.00;0;(###.00)}",-456.55); Salida: 457

Escape y Literales

Console.WriteLine("{0:###\#}",255); Salida: 255#

Parseo Numérico

Los números pueden ser parseados utilizando el método Parse(), esto es posible ya que lo provee el tipo de dato.

int iValue = Int32.Parse("123");double dValue = Double.Parse("1.23");

Input/Output

El lenguaje Común en Tiempo de Ejecución .NET provee funciones de entrada/salida en el namespace System.IO.

La lectura y escritura la realiza la clase Stream, la cual describe como los bytes pueden ser escritos o leidos. Stream es una clase abstracta que en la práctica las clases derivan de Stream para ser utilizadas.

Clases disponibles:

FileStream, flujo en un archivo de disco MemoryStream, flujo que es almacenado en memoria NetworkStream, flujo en una conexión de red BufferedStream, implementa un buffer en la cima de otro stream.

Lectura y Escritura de Archivos

Existen dos formas de obtener flujos (streams) que conectan a un archivo, uno utilizando la clase FileStream, la cual provee un control total sobre el acceso de archivos, incluyendo modo de acceso, compartido y buffering.

A continuación se muestra un ejemplo donde, cada vez que el programa es ejecutado se sobreescribe el contenido del archivo en caso de que este exista, si no existe se crea:

using System;using System.IO;

class App{public static void Main(){

FileStream f = new FileStream("nuevo.txt", FileMode.Create);

StreamWriter s = new StreamWriter(f);for(int iNumberLine = 1; iNumberLine <= 10;

iNumberLine++){s.WriteLine("Linea " + iNumberLine);

}s.Close();f.Close();

}}

Salida, Archivo Nuevo.txt cuyo contenido es:

Linea 1Linea 2Linea 3Linea 4Linea 5Linea 6Linea 7Linea 8Linea 9

Linea 10

Serialización

La Serialización es el proceso utilizado por el runtime para objetos persistentes en algún orden de almacenamiento o para transferirlos de un lugar a otro.

La información de los metadatos en un objeto contiene información suficiente para que el runtime serialice los campos, pero es necesario indicar al runtime hacerlo correctamente a través de dos atributos [Serializable] el cual es utilizado para marcar un objeto que es posible serializar y [NonSerialized] que es aplicado para un campo o propiedad para indicar que no debería ser serializado.

Threading (Hilos)

El namespace System.Threading contiene clases utilizadas para threading y sincronización. El tipo apropiado de sincronización y/o exclusión depende del diseño del programa, pero C# soporta exclusión simple utilizando la sentencia lock.

lock utiliza la clase System.Threading.Monitor y provee funcionalidad similar a la invocación de CriticalSection en Win32.

Atajos Teclado Photoshop

Combinaciones de teclas Básicos:

(H) Herramienta Mano, cuando tenemos ampliada una zona de nuestro proyecto mediante la herramienta Zoom, podemos movernos con la herramienta mano, algo que se utiliza mucho y agiliza es hacerlo mediante la tecla H, también podemos agrandar o disminuir el Zoom pulsando Ctrl+Clic o Shift+Clic respectivamente.

(Z) Herramienta Zoom, pulsando Z cambiamos la herramienta Zoom para ajustar el tamaño de la vista, mientras pulsemos Alt invertiremos el Zoom para alejar.

(Ctrl+0) Ajustar al tamaño de la ventana, para aprovechar al máximo el tamaño del monitor. Es Control más Cero, no la letra O.

(B) Herramienta Lápiz, extremadamente útil cuando trabajas con máscaras, perfecta combinación con los atajos de teclado Zoom y Herramienta de Mano.

(Ctrl+Z) Deshacer, muy útil para solventar esos pequeños errores que todos cometemos.

(Tab) Muestra/Oculta paletas, sencillo y eficaz, muestra u oculta todas las paletas para tener el proyecto a pantalla completa y sin estorbos.

Intermedios:

(, y .) Cambian el tamaño y el tipo de pincel

(Shift+[) Disminuye la suavidad del pincel, en un 25%.

(Shift+]) Aumenta la suavidad del pincel, en un 25%.

(de 1 a 0), varia la opacidad del pincel.

(Shift + del 1 al 0), varia el flujo del pincel.

(Ctrol+Tab) Muestra/Oculta Ventana de Capas, eficaz atajo de teclado para ganar espacio en el proyecto.

Avanzados:

(Ctrl+Shift+N) Nueva capa, sencillo atajo para crear una nueva capa en blanco

encima de la capa actual.

(Ctrl+Alt+Shift+N) Nueva capa sin dialogo, lo mismo que el anterior pero sin pasar por el dialogo de etiquetado de la capa, más rápido.

(Ctrl+Shift+C) Copia fusionada, copia el contenido de la selección actual para pegarla en otra capa o en otro proyecto, útil para copiar lo que se ve.

(Ctrl+Shift+Alt+E) Copia visible, copia el contenido de la seleccion (en cualquier capa) en la capa nueva.

(Ctr+Alt+Shift+K) Atajos de teclado, muestra el dialogo de ayuda y configuración de atajos de teclado, por si estos no han saciado tu sed de atajos de teclado.

Añadidos por usuarios

(Espacio) Herramienta Mano

(Ctrl+H) para ocultar la selección actual

(X) cambiar el color de fondo por el frontal

(F) Vista de área de trabajo

(Ctrl+D) Deseleccionar

(Ctrl+T) Cambio de tamaño de capas

(Ctrl+U) Ajustar luminosidad, tono y saturación

(Ctrl+M) Ajustar curva de colores

(Ctrl+L) Ajustar los niveles de colores

(Ctrl+Z) Deshacer último cambio

(Ctrl+Alt+Z) Deshacer el último paso

(T) Insertar texto

(Ctrl+Intro) Salir del modo Edición de texto

(Ctrl+I) Invertir los colores de la capa

(Ctrl+E) Fusiona las capas

(Q) Activa la capa rápida

(Ctrl+J) Nueva capa vía Copiar

(Ctrl+Shift+J) Nueva capa vía Cortar

(Ctrl+Alt+I) Tamaño de la imagen

(Ctrl+Alt+C) Tamaño del lienzo

(Ctrl+F) Repetir último filtro utilizado

(Ctrl+Shift+Coma) Aumenta el tamaño de la fuente, teniendo texto seleccionado.

(Ctrl+Shift+Punto) Disminuye el tamaño de la fuente, teniendo texto seleccionado.

 

Trucos Windows Live Messenger - MSN

erre de Sesión en Windows Live Messenger 2011

 Si eres de los usuarios que no esperas a que Messenger Plus salve el dia e instaló la versión 2011 de Windows Live Messenger, habrás notado que si usualmente cierras sesión por el menú contextual que aparece debajo de tu nombre, encontrarás tres opciones para hacerlo, la primera dice "Cerrar esta sesion (Nombre del Equipo)", la segunda "Cerrar sesion en todas las ubicaciones" y la tercera dice "Salir de Messenger". Estas nuevas opciones fueron diseñadas para un cierre de sesión más seguro de tu Messenger.

Cerrar esta sesión es él logoff normal, en el que se cierra tu cuenta de messenger y aparece la pantalla de inicio nuevamente. Cerrar sesión en todas las ubicaciones además de cerrar esa ventana, cierra todas la sesión en todos los computadores y dispositivos conectados a tu cuenta simultáneamente, así evitas que otra persona tenga acceso a tus contactos y tu información personal y Salir de Messenger, cierra sesión y cierra automáticamente la ventana para que no

tengas que hacerlo tú, esto lo haces cuando ya no vas a utlizar tu mensajero y vas a apagar tu equipo.

Otra manera de Cerrar tu Messenger, es haciendo clic derecho sobre el icono del mensajero en la barra de Tareas de Windows 7 y en las tareas, podrás cerrar sesión o salir de messenger.

 

Te brindamos en esta oportunidad algunos trucos para que tu Windows Messenger quede personalizado, y tal cual como tú quieres. Una cuestión bastante molesta en ocasiones son las notificaciones, esos cartelitos que salen a la altura de la barra de tareas, notificándonos, justamente, cuando uno de nuestros contactos inicia o finaliza sesión. Si tenemos muchos contactos, puede tornarse molesto, sobre todo si agregamos las notificaciones de nuestros amigos de Facebook. Para librarse de ellos, simplemente hacemos click en el menú, justo debajo de nuestro avatar. Allí pinchamos en Más opciones, en el menú desplegable que aparece. En la ventana emergente, seleccionamos Notificaciones, sobre la barra lateral izquierda, y procedemos a destildar las opciones por las que no queremos recibir más notificaciones. En la versión anterior de Messenger para Windows XP, en lugar de decir Notificaciones, dice Alertas, pero la función es la misma. Luego hacemos click en Aceptar, y listo, no más cartelitos molestos.

Otra cuestión que puede resultar molesta es el zumbido, pero pocos usuarios saben que pueden librarse del fastidioso ruido, sobre todo si lo usamos en el ámbito del trabajo. Vamos a Herramientas, y hacemos click en Opciones. En la solapa de Sonidos, sobre el margen izquierdo, donde encontraremos, además, la posibilidad de cambiar los sonidos predeterminados. En esta sección, seleccionamos Zumbidos, pinchando sobre la flechita lateral derecha, y se desplegará una amplia paleta de opciones. Simplemente tildamos en "No producir ningún sonido", y nos habremos librado del molesto timbre.

Un último truco, sumamente útil para cuidar nuestra privacidad, nos mostrará cómo chatear con alguien sin agregarlo a la lista de contactos. Pinchamos en

Acciones, luego en "Enviar mensaje instantáneo". Aquí tendremos la posibilidad de agregar a alguno de nuestros contactos a la conversación, o podremos, en el espacio inferior, agregar una dirección de correo electrónico por única vez, para chatear si agregarlo a nuestra lista de contactos.

Abrir dos sesiones a la vez en Windows Live Messenger 2011

El MSN Plus ya no funciona con WLM 2011 para iniciar dos o más sesiones simultaneamente, en su lugar debes bajar la extensión A-Patch. Sigue estos pasos:

Cierra tu sesión de WLM 2011 Entra a esta página: http://apatch.org/downloads/ En la sección "A-Patch for Windows Live Messenger 2011", haz clic en el

enlace "Download Now" para bajar el archivo .zip

Descomprime el archivo y dale doble clic al archivo ejecutable A-Patch143b16.exe

En la ventana que se abre, selecciona la opción "Patch Messenger" y haz clic en "Next"

Marca la casilla "Polygamy (Multi-MSN) y haz clic en "Apply"

Finalmente haz clic en el botón "Exit", se abrirá la ventana de WLM.

Inicia sesión con una de tus cuentas Para abrir otra sesión al mismo tiempo, haz clic derecho sobre el icono de

WLM en la barra de tareas y selecciona "Windows Live Messenger". Te logueas y listo!

Cómo conseguir la IP de tus contactos de Windows Live Messenger

Emuchos sitios se dice cómo es posible obtener la IP de un contacto de Messenger enviándole un fichero y mirando con netstat las conexiones.

Aquí voy a mostrar cómo es posible hacerlo sin enviar ningún fichero. Y obtener no solo la IP pública sino también las IPs internas de sus adaptadores de red. Se hará de forma manual, usando netstat, después usando Wireshark y por último expondré un programa que he realizado que automáticamente muestra las IPs de los contactos según se van obteniendo.

Lo primero que debemos saber es cómo funciona Messenger por encima. La autenticación la realiza conectándose a los servidores de Microsoft vía SSL.

Una vez autenticado todas las conversaciones pasan por los servidores de Microsoft sin ningún tipo de cifrado (así que cuidado con utilizar Messenger en redes inseguras).

Un tema aparte es como se envían entre los contactos ficheros, imágenes, avatares y emoticonos. Para ello Messenger utiliza un protocolo p2p. Así que cuando un contacto solicita por ejemplo nuestro avatar se inicia una negociación entre nosotros y el contacto para ver cómo es posible realizar la conexión. En este punto ambas partes se intercambian las IPs internas y externas, puertos, tipo de conexión, si usamos NAT, UPnP, etc&

En en este punto a donde podemos aprovecharnos para saber la IP del otro contacto.

Con netstat

La opción más fácil es utilizar netstat para monitorizar las conexiones y ver las nuevas conexiones que realiza el proceso del Messenger. Vamos a ello. Todo desde la consola.

El proceso encargado de las comunicaciones de Messenger es wlcomm.exe. Así que obtenemos su PID:

tasklist | find "wlcomm.exe"

Ahora con el PID podemos filtrar la salida de netstat para quedarnos solo con las conexiones que realiza dicho proceso(requiere permisos de administrador):

netstat -nabo | find "PID_ENCONTRADO"

Ahora en este punto iniciamos una conversación con el contacto del que nos interesa saber la IP y le enviamos un emoticono personalizado, para no levantar sospechas lo mejor es un emoticono transparente o blanco. Se iniciará la negociación entre los dos clientes y se iniciará la conexión. Volvemos a lanzar el comando anterior y veremos una nueva conexión de nuestro contacto.

Con Wireshark

Vamos a filtrar los paquetes obtenidos por Wireshark para quedarnos con aquellos donde se realiza la negociación entre dos contactos. De ahí cogeremos la IP externa y las internas.

Wireshark ofrece el filtro "msnmspara quedarnos con los paquetes del procolo de Messenger.

Mirando paquete a paquete en uno de ellos encontraremos algo así:

Fijaos en estas cadenas:"srddA-lanretxE4vPIDando la vuelta a la cadena: IPv4External-Addrs"srddA-lanretnI4vPI > IPv4External-Addrs

En esos campos se muestran las IPs y puertos donde se debe realizar la conexión. Claro que hay que darles la vuelta. Mirando el campo "From:sabremos de que contacto es la IP.

Ir mirando los paquetes uno a uno buscando estos campos no parece muy divertido. Es mas cómodo hacer un filtro que busque en todo el paquete la cadena "srddA-lanretxE4vPIo "stroPdnAsrddAlanretxE4vPI(que es otra de las formas en las que aparece).

Este es el filtro que se queda con los paquetes que nos interesan:

frame[0:] contains 73:74:72:6f:50:64:6e:41:73:72:64:64:41:6c:61:6e:72:65:74:7 8:45:34:76:50:49:3a:20:36:34:37:33:3a:31:39:2e:35:30:31:2e:39:34:2e:35:38:0d:0a or frame[0:] contains 73:72:64:64:41:2d:6c:61:6e:72:65:74:78:45:34:76:50:49

Con el programa GetMSNIPs

Usando Wireshark con el filtro se pueden obtener las IPs de una manera bastante cómoda. Pero me apetecía hacerlo un poco mas sencillo y ya de paso programar algo usando WinPcap.

El resultado es este programa que ahora expongo, le he llamado GetMSNIPs, me encantan los nombres originales. No pongo el código aquí que son 300 líneas.

GetMSNIPs: Source y binario.

Una captura de cómo funciona:

  

Modo de uso:

Si no tiene instalado WinPcap, instálelo!. Arranque "GetMSNIPs" y seleccione la interfaz con la que se conecta a

internet. Inicie Windows Live Messenger y cámbiese de avatar, utilice uno que no haya

usado antes (así sus contactos no lo tendrán y se iniciará una conexión P2P para su envío).

Espere un tiempo ó inicie conversaciones con sus contactos para forzar a que carguen su avatar y capturar así su IP.

Así que ya sabéis, si usáis Windows Live Messenger estas diciendo a tus contactos tu dirección IP. No es un gran problema, pero está bien saberlo.

Trucos imprescindibles para Windows Live Messenger:

 

Atajos de teclado para Windows Live Messenger:

Texto en negrita: CTRL + B

Subrayar texto: CTRL + U

Buscar texto: CTRL + F

Cerrar ventana: ALT + F4

Grabar un mensaje de voz: F2

Desplegar menú me emoticones: CTRL + E

Bloquear MSN: CTRL + Barra Espaciadora

 

1. Añadir emoticones:Pulsa sobre el menú “Herramientas/Crear emoticones”. Una vez allí, añade nuevos smileys con el botón “Añadir”, uno por uno.Deberás indicar el smiley (archivo .PNG) que deseas añadir en cada caso y para ello debes buscar los archivos de la carpeta donde están ubicados. Pulsa en “Examinar”.Cuando asocies el smiley con la combinación de teclas, te recomendamos utilizar la barra para componer el nombre (ejemplo: /nombreSmiley). Así es muy fácil recordarlo y utilizarlo únicamente cuando quieras.

2. Cambiar de línea en la ventana:Para poder insertar un salto de línea en la pantalla de chat apretaremos la tecla SHIFT y pulsaremos ENTER.

3. Cómo cambiar la imagen de fondo de Windows Messenger:Si estás cansado de la imagen de fondo que ofrece Windows Messenger, la puedes cambiar realizando los siguientes ajustes en el registro de Windows:

o Localiza el directorio donde se encuentra instalado en tu sistema. (Normalmente C:\ARCHIVOS DE PROGRAMA\MESSENGER, ubicación que podemos encontrar en el registro de Windows). Haz clic en el botón Inicio y a continuación sobre Ejecutar, escribe Regedit y pulsa el

botón Aceptar. En el registro de Windows, busca la siguiente clave: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MessengerService.

o En el valor InstallationDirectory, renombraremos el archivo lvback.gif por lvback.old.

o A continuación copiaremos y renombraremos la nueva imagen que utilizaremos como fondo.

NOTA: Modificar el registro sin conocimiento puede causar efectos negativos en el sistema, por lo que no nos hacemos responsables del posible daño.

4. Eliminar inicios de sesión: o Ve a Inicio/Ejecutar.o Escribe control userpasswords2 y haz clic en Aceptar.o Se abrirá una ventana en la que debes elegir la pestaña “Opciones

Avanzadas”.o Haz clic en el botón “Administrar Contraseñas”.o Elige la cuenta que deseas borrar y haz clic en “Quitar”.o Cierra la ventana.

5. Eliminar Messenger: o Asegúrate de tener cerrados el Messenger, el Outlook Express y el

Internet Explorer.o Ve a Inicio/Ejecutar y escribe RunDll32 advpack.dll,LaunchINFSection

%windir%\inf\msmsgs.inf,BLC.Remove.6. Eliminar Zumbidos:

Tenemos que ir a Herramientas/Opciones y, en el panel de la izquierda, seleccionar Mensajes.En la pantalla de la derecha desactivar la casilla: “Permitir enviar y recibir zumbidos”.Aplicar y aceptar. A partir de ahora, cuando te manden un zumbido recibirás el mensaje, pero no el sonido ni el movimiento agresivo de la ventana.Nota: Este truco ha sido probado con la versión 7.5 de Windows Messenger

7. Enviar un mensaje a alguien que te tenga omitido:Primero, hay que ponerle a la persona que nos omite “Sin Admisión”.Ahora, lo que hay que hacer es ponernos como Nick el mensaje que queremos mandarle. Y por último, la volvemos a admitir.Desde luego que no podremos chatear con esta persona, pero le saldrá al momento una ventanita con nuestro Nick (que en realidad será el mensaje que queramos decirle) diciendo que acabamos de iniciar sesión.¿Por que la hemos omitido primero? Porque así el mensaje solo le saldrá a ella, y no a toda la lista de contactos, al admitirla de nuevo, sólo le saldrá a esta persona la ventanita.

8. Escribir mensaje en 2 colores y fuentes distintas: o Mantenemos pulsado alt y tecleamos 3012.o Soltamos alt y escribimos.o Mantenemos pulsado shift y pulsamos enter.o Repetimos el paso nº1 y nº2 y mandamos el mensaje.o En vez de escribir 3012 podemos usar:4562, 85421, 1478, 3692

E incluso en el paso 1 podemos poner uno de los números y en el paso 4 poner otro.

¿Qué hace? Pues bien, el primer texto que escribimos sale con la letra y el color que tengamos puesto, el segundo texto saldrá en negro y la letra depende del número que usemos.

9. Evitar que el Messenger se active de forma automática sin preguntar contraseña en Windows XP:Si utilizas Windows XP y, al arrancar el equipo, ves que MSN Messenger se conecta automáticamente, sin preguntarte la contraseña de tu cuenta Passport, tendrás que borrar dicha contraseña.Para borrar la contraseña pulsa en Inicio/Panel de control/Cuentas de usuario.Busca tu perfil y a la izquierda pulsa en Administrar mis contraseñas de Red.Quita la que dice Passport.NET, que es la que proporciona la información al equipo cada vez que se arranca.

10. Guardar tu lista de contactos:Esta utilidad nos puede servir para migrar los contactos de una cuenta, o bien para tener una copia de seguridad.Para guardar los datos de contactos del Messenger tendremos que ir a Contactos/Guardar la lista de contactos… y seleccionar la ubicación donde queremos guardar el fichero.El fichero se guardará en con la extensión “*.ctt” con un formato de XML.Para importar todos los contactos al Messenger, podemos recuperarlo cliqueando en Contactos/Importar contactos de un archivo.

11. Plantillas para Nicks en Messenger:

(¯`·._.·[ ( Tu Nombre Aqui ) ]·._.·´¯)

¨°o.O ( Tu Nombre Aqui ) O.o°

×÷·.·´¯`·)» ( Tu Nombre Aqui ) «(·´¯`·.·÷×

· ··^v´¯`×) ( Tu Nombre Aqui ) (×´¯`v^·· ·

,.-~*’¨¯¨’*·~-.¸-(_ ( Tu Nombre Aqui ) _)-,.-~*’¨¯¨’*·~-.¸

- - –^[ ( Tu Nombre Aqui ) ]^– - -

•·.·´¯`·.·• ( Tu Nombre Aqui ) •·.·´¯`·.·•

`·.¸¸.·´´¯`··._.· ( Tu Nombre Aqui ) `·.¸¸.·´´¯`··._.·

(¯`·._) ( Tu Nombre Aqui ) (¯`·._)

¯¨’*·~-.¸¸,.-~*’ ( Tu Nombre Aqui ) ¯¨’*·~-.¸¸,.-~*’

Oº°‘¨ ( Tu Nombre Aqui ) ¨‘°ºO

׺°”˜`”°º× ( Tu Nombre Aqui ) ׺°”˜`”°º×

.·´¯`·->; ( Tu Nombre Aqui ) <;-·´¯`·.

<;º))))>;<;.·´¯`·. ( Tu Nombre Aqui ) ¸.·´¯`·.¸>;<;((((º>;

- -¤–^] ( Tu Nombre Aqui ) [^--¤- -

~²ºº²~ ( Tu Nombre Aqui ) ~²ºº³~

._|.<;(+_+)>;.|_. ( Tu Nombre Aqui ) ._|.<;(+_+)>;.|_.

..|..<;(+_ ( Tu Nombre Aqui ) _+>;..|..

-·=»‡«=·- ( Tu Nombre Aqui ) -·=»‡«=·-

•°o.O ( Tu Nombre Aqui ) O.o°•

––––•(-• ( Tu Nombre Aqui ) •-)•––––

(¯`•¸·´¯) ( Tu Nombre Aqui ) (¯`·¸•´¯)

··¤(`×[¤ ( Tu Nombre Aqui ) ¤]×´)¤··

—(•·÷[ ( Tu Nombre Aqui ) ]÷·•)—

·ï¡÷¡ï· ( Tu Nombre Aqui ) ·ï¡÷¡ï·

·!¦[· ( Tu Nombre Aqui ) ·]¦!·

°º¤ø,¸¸,ø¤º°`°º¤ø,¸ ( Tu Nombre Aqui ) °º¤ø,¸¸,ø¤º°`°º¤ø,¸

;)°¨¨°º”°¨¨°(*)(_.·´¯`·«¤° ( Tu Nombre Aqui ) °¤»·´¯`·._)(*)°¨¨°º”°¨¨°;)

»-(¯`v´¯)-» ( Tu Nombre Aqui ) »-(¯`v´¯)-»

°l||l° ( Tu Nombre Aqui ) °l||l°

•°¤*(¯`°(F)( ( Tu Nombre Aqui ) )(F)°´¯)*¤°•

—¤÷(`[¤* ( Tu Nombre Aqui ) *¤]´)÷¤—

¸.´)(`·[ ( Tu Nombre Aqui ) ]·´)(` .¸

<;.:._–.–.–o ( Tu Nombre Aqui ) o–.–.–_.:.>;

·÷±‡± ( Tu Nombre Aqui ) ±‡±÷

+*¨^¨*+ ( Tu Nombre Aqui ) +*¨^¨*+

±X±((_*_|_*_))?´¯`»(NICK)«´¯`?((_*_|_*_))±X±

“½(¯`·.¸¸.·°·.¸¸.·´¯)·´¦`·(¯`·.¸¸.·°·.¸¸.·´¯) ½”

“½(¯`·.¸¸.·°·.¸¸.·´¯)I±Ø±I´¦`·(¯`·.¸¸.·°·.¸¸.·´¯) ½”

12. Saber si los servidores del Messenger están caídos:Para poder visualizar el estado de los servidores de Messenger, debes acceder a la siguiente url: http://messenger.msn.es/Status.aspx

13. Utilizar Messenger con cualquier cuenta de correo:Podemos utilizar MSN Messenger con cuentas de correo que no sean de Hotmail o de MSN.Para poder utilizar Messenger sin una cuenta de correo propietaria de Messenger o de MSN deberemos de acceder a la página http://www.passport.com y dar de alta la dirección de correo que deseamos utilizar con Messenger.Una vez creada la cuenta passport, podremos acceder al Messenger con nuestra cuenta de correo personal.

14. Utilizar un nombre en blanco:En el espacio para poner el nick, mantén presionada la tecla alt y con el teclado numérico tienes que escribir 0160. Ya tienes el nick en blanco.

Saber si otra persona ha cerrado la ventana del chat

 Imaginaros que estais hablando con alguien y tarda mucho en escribir...pues para saber si ha cerrado la ventana del chat donde hablabais podeis hacer lo siguiente: en la ventana que tenias hablando con esa persona, le das a invitar a alguien a esta conversacion, si en la lista aparece esa persona, es que te cerró la ventana!!!

Usar cualquier cuenta de correo para tu MSN

  Para usar el MSN Messenger no es obligatorio tener la cuenta de Hotmail o MSN. Podéis poner cualquier tipo de e-mail. Para hacerlo debeis visitar http://www.passport.com/ y daros de alta con la dirección de correo "habitual" que uséis o que queráis tener en el MSN Messenger ... así de sencillo.

Como saber quién me ha borrado del Messenger

 Todos siempre queremos saber quién nos ha eliminado de su cuenta de messenger y andamos buscando programitas por ahí para saberlo.El problema de los programitas para saberlo, es que, no tienen porqué funcionar ya que si no usas una cuenta de Hotmail, ni siquiera funciona...

Con este sistema es SEGURO saber si alguien te ha ELIMINADO (que no "No Admitido) de su lista, ya sea porque te ha eliminado, ya sea porque su cuenta "ha caducado" y ya no existe.

Entra en tu Messenger, y te vas al menú de Herramientas -> Opciones.

Una vez allí, hay que ir al menú Privacidad donde aparecen dos listas con la gente que has añadido alguna vez al messenger... a la izquierda los que están Admitidos, a la derecha los No Admitidos.

Si vas "uno por uno" sobre cada una de las personas, pulsando con el botón derecho del ratón (Propiedades) te puede parecer "activada" o "desactivada" la casilla de Eliminar. Si la casilla aparece activada es que esa persona te ha BORRADO de su lista de personas, o simplemente que esa cuenta YA NO EXISTE.

Borrar el email de inicio de sesión del MSN XP

 Para poder borrar de la lista de inicios de sesiones del msn, un email,podeis hacer esto (en WinXP):

1.- vamos al panel de control, luego a cuentas de usuarios2.- selcciona tu cuenta de usuario3.- hacer click en administrar mi pass de redes4.- selecciona el email que kieres eliminar5.- pulsa eliminar6.- pulsa ok7.- cierra

Donde se guarda el password

 Todos sabemos que a la hora de iniciar una sesión en nuestro messenger, se nos pide un nombre de usuario y una contraseña. En la esquina inferior izquierda de esa ventana de identificación, encontramos una opción que podemos marcar: “recordar nuestro nombre de usuario y contraseña en este equipo”. ¿Alguna vez os habéis preguntado dónde guarda esta información? Pues la respuesta es en el registro. Y más concretamente, en la entrada de registro: "Hkey_Current_UserSoftwareMicrosoftMessengerServicePasswordMSN Messenger Service".

Sin embargo, Mocosoft no nos lo iba a poner tan sencillo (aunque casi) y el password se encuentra cifrado, así que para conocerlo deberemos descifrarlo (y eso os lo vais a tener que currar vosotros)... En nuestra sección accesorios tenéis a vuestra disposición un programa que hace esta función.

Pero esa no es la única clave en el registro interesante que hace nuestro querido Messenger... y sino fijaos en 'HKEY_CURRENT_USERSoftwareMicrosoftMessengerServiceListCache.NET Messenger Service', donde podremos ver no sólo toda nuestra lista de contactos, sino además si figuran como admitidos o no admitidos. En un primer vistazo parece que toda esta información se encuentra cifrada, sin embargo, no es así. Sólo tenemos que hacer doble clic en cualquiera de las entradas y en la nueva ventana que se abre (en la parte de la derecha) podremos ver la dirección de correo electrónico de ese contacto.

Pero eso no es todo. Si miramos en esa misma entrada de registro nuestra información, veremos que, si hemos rellenado todos los datos que nos pide el messenger, también se encuentran ahí almacenados nuestro teléfono de casa, el móvil y el del trabajo :O

Para ello debemos buscar las siguientes siglas: PHH (home telephone number) – contiene el teléfono de casa PHM (mobile telephone number) – contiene el teléfono del móvil PHW (work telephone number) – contiene el teléfono de nuestro trabajo

Además toda esta información se encuentra sin cifrar, así que haciendo un Netbios he introduciéndonos en la clave del registro de la víctima "Hkey_Current_UserSoftwareMicrosoftMessengerServicePasswordMSN Messenger Service" podremos obtener sus números de teléfono rápidamente... eso sí, recordad que para ello el usuario de ese PC debe haberlos introducido antes, lo que es poco probable ya que por ejemplo en España, esos datos son opcionales, además de no disponer todavía de los servicios relacionados con llamadas telefónicas ni envíos de mensajes sms que en otros países sí están activados.

Como poner un Nick vacío

 Si te has dado cuenta cada vez que deseas dejar tu Nick en blanco no se puede, para que esto no te pase de nuevo haz lo siguiente; donde se escribe el Nick dejando presionada la tecla Alt. escribes con el teclado numérico 0160, verás como se crea un vacío en tu Nick

Evitar conversaciones con personas que no tenemos en la lista

Abre el menú Herramientas del MSN, pulsa en Opciones, se te abre una ventanita, pulsa en Privacidad, y ahora en la lista de personas que pueden ver nuestro estado de conexión, seleccionamos "Los demás usuarios" y pulsamos en No admitir.

Enviar un mensaje a alguien que te tenga omitido

Primero, hay que ponerle a la persona que nos omite Sin Admisión. Ahora, lo que hay que hacer es ponernos como Nick el mensaje que queremos mandarle. Y por último, lo volvemos a admitir. Desde luego que no podremos hablar con él, pero le saldrá al momento una ventanita con nuestro Nick (que en realidad será el mensaje que queramos decirle) diciendo que acabamos de iniciar sesión. Por que lo hemos omitido primero?? porque así el mensaje solo le saldrá a el, y no a toda la lista de contactos, al Admitirlo de nuevo, solo le saldrá a el la ventanita.

Cambiar de línea en la ventana del chat

Si te das cuenta que cada vez que queremos escribir en una línea nueva presionamos enter y la tenemos, pero en el MSN al hacerlo nos envía el mensaje sin querer, para poder cambiar la línea solo debemos tener presionado SHIFT y la tecla Enter.

Chatear con alguien sin necesidad de agregarlo a tu lista

Pones el mail de una persona que tenga MSN y puedes chatear con ella sin tener que agregarla a la lista. Es perfecto para evitar que nos añadan a nosotros, o para evitar que a la otra persona le salga el mensajito de que alguien la ha añadido al MSN, ideal para bromas...

Cambiar la frase que dice "No revele contraseña...." al comenzar una conversación

Para poder cambiar esta frase debemos ir a INICIO-EJECUTAR ahí tipeamos REGEDIT presionamos ENTER, se abrirá una nueva ventana y seguimos estas opciones:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MessengerService\Policies

Luego sobre la cadena "IMWarning" hacemos click derecho y damos en modificar, nos aparecerá la famosa frase y escribiendo cualquier otra sobre esta ya estará hecho!, verás que fácil que es.

Cambiar imagen de fondo

Esta imagen se encuentra dentro de la carpeta donde tengamos instalados el mensajero, generalmente esta dentro de: C:/Archivos De Programa/Messenger dentro de esta carpeta existe una imagen llamada lvback.gif, que es la que contiene la imagen que se encuentra de fondo, 160x140 pixeles generalmente aunque no se confíen de este dato...prueben, abranla en el paint o en alguno parecido y miren, luego solo basta con crear una imagen de igual tamaño y reemplazarla con el mismo nombre, antes hacer un backup (resguardo) de la imagen.

Cambiar sonidos en Msn

Bien, si queremos cambiar los sonidos que trae por defecto el mensajero solo basta con ir a MI PC->PANEL DE CONTROL->SONIDOS, allí veremos una lista de eventos, debemos encontrar una llamada: MSN MESSENGER y allí hacemos los cambios que creamos necesarios.

Quitar Windows Messenger de XP

A veces nos resulta molesto el windows messenger que viene en xp o queremos instalar otra versión, bueno lo que debemos hacer es esto: Haz click en el botón Inicio y selecciona Ejecutar.Teclea RunDll32 advpack.dll,LaunchINFSection %windir%\INF\msmsgs.inf,BLC.Remove en la caja de diálogo y clickea en OK. Aparecerá una barra de progreso donde puedes seguir el proceso de desinstalación. Es posible que te pida reiniciar el equipo. Si es así, lo reinicias.

Averiguar la IP de la persona con la que hablas

Es muy sencillo, solo tienes que enviar un archivo a esta persona (o que te lo envie ella a ti) puedes enviar cualquier cosa, pon alguna excusa buena ;-) bueno la cuestión es que cuando se esté transfiriendo el archivo, vas al MS-DOS y escribes: c:\netstat -a Te saldran una serie de ip's y servidores, pero no te será dificil reconocer la Ip de tu amigo. Para reconocerla mas facilmente, intenta no tener paginas web abiertas, ya que de esta forma te saldran mas Ip's y te será mas dificil encontrarla.Si escribes: c:\netstat -a > archivo.txt te creará un archivo.txt con el contenido del netstat, asi lo podras analizar más facilmente.

Guardar/Recuperar lista de contactos

Hay una opción en el MSN Messenger que es bastante útil cuando nos hacemos una cuenta nueva y queremos añadir todos los contactos que teníamos en la otra. Para ello, sólo tienes que ir a: Archivo >> Guardar Lista de Contactos Se guardará un archivo con todos tus contactos y sus direcciones, para recuperar esa lista de contactos en otra cuenta que tengas, sólo tienes que ir a: Archivo >> Importar contactos de un archivo Y aquí, seleccionas el archivo que guardaste antes Cambiar de línea en la ventana de chat Cuando estés chateando y quieras hacer un cambio de línea (normalmente se hace pulsando INTRO en los editores de texto), en el MSN Messenger pulsar INTRO significa mandar el mensaje, esto se arregla manteniendo pulsada la tecla de Mayúsculas y pulsar una vez INTRO, verás como se produce un cambio de línea y no mandas el mensaje aún.

Ventana sin datos (ni mail, ni nick...)

Con este truco puedes hacer que al abrir una ventana de chat a alguien este no sepa con quien habla ya que no le aparece arriba el mail ni el nick, jeje. Se hace de la siguiente manera:En el menú de cambiar el nick, escribes lo siguiente, mantienes pulsada la tecla ALT y luego presionas los números 0160 del teclado numérico (ALT+0160) se creará un "vació" en blanco, ahora seleccionas ese "vació" con el ratón, y haces COPIAR, y luego lo PEGAS muchísimas veces más en el nick hasta que te canses jeje (puedes hacer Ctrl+C para copiar, y Ctrl+V para pegar).

Zoom en MSN 6.0

Manten 'Control' presionado y muevo la rueda del raton para aumentar o disminuir las letras de la ventana de conversación.

Cómo quitar la ventana de MSN Hoy

Para quitar esta molesta ventana que sólo muestra publicidad y realentiza tu pc deberás seguir estos pasos: 1- Ejecuta tu Messenger e inicia sesión 2- En la ventana principal del Messenger haz clic en HERRAMIENTAS 3- Selecciona OPCIONES 4- En PREFERENCIAS desactiva la opción MOSTRAR MSN HOY 5- Acepta y reinicia la sesión.

Escribir mensaje en dos colores y fuentes distintas

1.- mantenemos pulsado alt y tecleamos 30122.- soltamos alt y escribimos3.- mantenemos pulsado shift y pulsamos intro4.- repetimos el paso nº1 y nº2 y mandamos el mensajeEn vez de escribir 3012 podemos usar:4562, 85421, 1478, 3692E incluso en el paso 1 poner uno de los numeros y en el paso 4 poner otro.Que hace? pues bien, el primer texto que escribimos sale con la letra y el color que tengamos puesto, el segundo texto saldra en negro y la letra depende del numero que usemos.

Configurar el Firewall para enviar archivos con el Messenger

Para enviar archivos con el Messenger en Windows XP debes configurar el Firewall siguiendo estos pasos:

Haz clic en el botón Inicio y luego sobre Panel de Control.

1.- Busca el icono de Conexiones de Red y haces doble clic sobre él

2.- Selecciona el icono de tu conexión de Red y haces clic con el ratón derecho sobre Propiedades, luego sobre la pestaña Avanzadas, ahí vuelve a pinchar sobre el botón Configuración.

3.- En la pestaña Servicios pincha sobre el botón Agregar

4.- En el apartado Descripción del Servicio escribe lo que quieras, por ejemplo Enviar archivos con el Messenger.

5.- En el apartado Nombre o dirección IP..... el nombre de tu ordenador, si no sabes exactamente como es, vas al Panel de Control, Sistema y Nombre de equipo (debes ponerlo tal como está aquí).

6.- En el apartado Número de puerto externo debes poner 6891 y seleccionar la opción TCP si es que no lo está.

7.- En el apartado número de puerto interno pones 6891 aceptas todo y comienza a enviar tus archivos.

8.- Hasta este punto sirve para enviar solamente un archivo a la vez, pero si deseas enviar hasta 10 archivos hay que hacer exactamente lo mismo para

los puertos 6891 y 6900.

 

Emoticones

Ahora veremos todos los iconos secretos en el msn, presiona la combinación indicada para verlos:

  

(Y)  o  (y)

    (N)  o  (n)

    (B)  o  (b)

    (D)  o  (d)

    (X)  o  (x)

     (Z)  o  (z)

     :-[  o  :[

     (})

     ({)

     :-)  o  :)

    :-D  o  :d

     :-O  o  :o

     :-P  o  :p

     ;-)  o  ;)

     :-(  o  :(

     :-S  o  :s

     :-|  o  :|

     :'(

     :$  o  :-$

    (H)  o  (h)

    :-@  o  :@

     (A)  o  (a)

     (6)

     (L)  o  (l)

     (U)  o  (u)

     (K)  o  (k)

     (G)  o  (g)

     (F)  o  (f)

    (W)  o  (w)

     (P)  o  (p)

     (~)

     (T)  o  (t)

     (@)

     (&)

    (C)  o  (c)

     (I)  o  (i)

     (S)

     (*)

     (8)

    (E)  o  (e)

     (^)

     (O)  o  (o)

     (T)  o  (t)

(M)  o  (m)

(R)

(#)

(%)

     ¿ (?)

 

 

Emoticones ocultos del nuevo MSN 6

Cifrar tus conversaciones con el Messenger

Seguro que estas cansado de ver cada vez que inicias una nueva conversación, un aviso de Microsoft advirtiéndote:"Nunca revele sus contraseñas o números de tarjetas de crédito en una conversación de mensajes instantáneos."

Desde luego ésto da qué pensar... así que vamos a explicar una forma de conseguir mejorar un poco la seguridad de nuestras conversaciones.

Tanto si nos conectamos a una red local (y no queremos que el administrador de la red, lea nuestras coversaciones), como si nos conectamos desde nuestro pc directamente a la Red (y queremos evitar que un hacker intercepte de forma limpia nuestros mensajes y pueda leerlos fácilmente) vamos a utilizar un programa que les hará más difícil entender una coversación: vamos a cifrarla.

Para conseguirlo, vamos a utilizar SPYSHIELD un accesorio para Msn Messenger que es compatible con PGP.

El PGP (Pretty Good Privacy ó Cifrado bastante buena) es un sistema de encriptación por llave pública escrito por Philip Zimmermann, y sirve para que nadie salvo uno mismo y el destinatario o destinatarios a los que vaya dirigido el mensaje puedan leerlo, al ir los mensajes codificados.

También puede usarse para comprobar la autenticidad del mensaje asegurándonos que lo ha escrito el remitente en realidad, realmente es muy bueno y es prácticamente indescifrable.

El funcionamiento es muy sencillo, cada usuario tiene dos llaves una pública

y otra privada, la pública es la que distribuye a la gente y sirve para que ellos puedan enviarle un mensaje codificado que solo él mediante su llave privada podrá descifrar, también puede servir para firmar un mensaje poniendo una parte de su llave privada (irreconocible claro) en una firma, esto es como un certificado de autenticidad, ya que al recibir el mensaje el PGP comprueba la firma y texto y lo compara con la llave pública que tenemos del remitente dando un error si se ha cambiado algo en el texto o la firma no corresponde a la persona que nos envía el mensaje.

Sirve también para enviar ficheros a través de correo electrónico codificados en formato ascii y mucho mejor que otros sistemas como el uuencode ya que el PGP usa antes de codificar una compresión zip al documento o programa que va a codificar.

Tenéis toda la información que queráis sobre este tema en la web en castellano http://pagina.de/pgp

Es importante saber, que el SPYSHIELD parece no fucionar con las nuevas versiones del PGP, así que tenéis que aseguraros que instaláis la versión de PGP 6.5.8. Todo esto lo tenéis disponible en la sección accesorios de esta web.

 

Modificar el historial de usuarios en MSN Messenger

Precisamente en esta oportunidad presentaré un truco que permite eliminar nuestra dirección de correo electrónico de la lista de direcciones de correo que aparece en el historial de MSN Messenger de Microsoft®, logrando de esta manera mantener privada nuestra dirección cuando iniciamos sesión en algún MSN Messenger de un Cybercafé, Universidad, o cualquier centro de computación público.

El problema principal es que al iniciar sesión nuestra dirección de e-mail (que deseamos mantener privada) queda almacenada automáticamente y el próximo usuario que haga uso de la PC podrá observar nuestro email.

Para lograr este truco se deben seguir los siguientes pasos:

1.- Hacer click en "Inicio", luego en "Ejecutar"2.- Escribir en la caja de texto: control userpasswords23.- Luego, al presionar el botón Aceptar aparecerá la ventana de "Cuentas de usuario"4.- Posteriormente se selecciona la pestaña "opciones avanzadas"5.- Hacer click en "Administrar contraseñas" y luego seleccionar la dirección que deseamos mantener privada.6.- Ahora se presiona el botón "Quitar"

 

Windows Messenger bajo un router o firewall

Si nos conectamos a Internet a través de un Firewall o un router habremos comprobado que algunas de las características de Windows Messenger no funcionan de forma correcta. Para solucionar este problema tendríamos que

configurar en el firewall o router el uso de los siguientes puertos Videoconferencia, audio, video y llamadas de PC a teléfono:Puertos UDP 5004-65535. Debido a que el envío de flujos se aloja dinámicamente en este rango de puertos, tendremos que encontrar la manera de abrir todos ellos. Application Sharing y WhiteBoard: Puerto TCP 1503Transferencia de archivos: Puertos TCP 6891-6900. Estos puertos permiten hasta 10 transferencias simultáneas por usuario. Si únicamente abrimos el puerto 6891, el usuario únicamente podrá realizar una única transferencia simultánea.Asistencia Remota: Puerto TCP 3389

 

¿Quieres saber quien te tiene añadido en su lista?

Esto mas que un truco, es una opcion del MSN pero que poca gente se ha dado cuenta que existe!! Para saber si estas en la lista de alquien, haz lo siguiente:>>Herramientas >>Opciones >>Privacidad >>Botón VER Aqui te saldrá una lista con todas las personas que te tienen fichado.

 

Desinstalar Windows Messenger de XP

Si tenemos instalado el Service Pack 1, debería aparecer en la lista de Agregar y quitar programas.

Sino, podemos editar C:\Windows\inf\sysoc.inf y cambiar la línea que pone msmsgs=msgrocm.dll,OcEntry,msmsgs.inf,hide,7 por msmsgs=msgrocm.dll,OcEntry,msmsgs.inf,,7 Una forma rápida es ejecutar: RunDll32 advpack.dll,LaunchINFSection %windir%\inf\msmsgs.inf,BLC.Remove También usando Messenger Remove, MessengerDisable o MessengerOff La forma oficial de Microsoft se describe aquí. Pero si hacemos esto, el Outlook Express tardará más de lo normal es iniciar. Para corregirlo debemos añadir en el registro:

HKEY_LOCAL_MACHINE\Software\Microsoft\Outlook Express\Hide Messenger = 2

 

Configurar Messenger para que use nuestro antivirus

Para acceder a la configuración en nuestro Messenguer de que nos revise con nuestro anti-virus las transferencias:

Abrimos nuestro Messenger, vamos a Herramientas - > Opciones - >Trasferencia de archivos

Marcamos Examinar los archivos en busca de virus usando, después ajustamos el camino hasta nuestro anti-virus con el botón Examinar

Algunos ejemplos:

Para Kaspersky :C:\Archivos de programa\Kaspersky Lab\Kaspersky Anti-Virus Personal Pro\Avp32.exe

Para AVG AntiVirus Grisoft :C:\ Archivos de programa\Grisoft\AVG6\avgw.exe

Para Mc Afee :C:\ Archivos de programa\mcafee.com\vso\mcvsftsn.exe

Para NAV2002 :C:\ Archivos de programa\Norton AntiVirus\NAVW32

Para Norton :C:\ Archivos de programa\Norton Antivirus\ccIMScan.exe

Para Avast :C:\ Archivos de programa\Alwil Software\Avast4\ashAvast.exe

Para lo usuarios de EZ-Trust, es necesario ajustar Messenger de esta manera :

* Para Windows NT/2000/XP"\VetNT.exe" /display=notify* Para les Windows W9x/Me"\Vet98.exe" /display=notify

Nota: Se entiende que para cada antivirus necesitamos personalizar nuestro messenger apuntando al ejecutable de nuestro antivirus.