Home » febrero 2015
java development, java y desarrollo parte 2

Muchas veces necesitamos redireccionar hacia otras páginas, ya sea dentro de un mismo sitio o afuera de el. Existen diferentes maneras de hacerlo, como desarrollador web debes determinar cual es la que mas se adapta a tus necesidades. A continuación describiré cuatro de ellas, que son las que mas se utilizan. Redirección por HTML (Meta Refresh) Esta forma de redireccionar se hace poniendo una etiqueta HTML en vuestra página, convencionalmente debe usarse entre , pero funcionalmente la podemos tirar en cualquier lado. Al momento de el navegador encontrarla, se redireccionará automáticamente a la web especificada en la etiqueta. También se debe especificar la porción de segundos que debe esperar el navegador para redireccionar (en el ejemplo 3):

java development, Aprender sobre Procesos en C#

Como ingenieros de troubleshooting en aplicaciones funcionales, uno de os dificultades más comunes son os hangs de las mismas ( No responde, muy lento, crasheó ). Lo primero que debemos revisar es que proceso está consumiendo demasiada memoria. Existe un artículo de Microsoft que se llama ProcessExplorer, el cual te ayuda a visualizar estos valores de memoria fisica, virtual, paginación, etc por proceso. En este post es muy sencillo sacar felicidad información desde C# .NET, veamos como: Código Se crea una clase para guardar la info de cada proceso. publi classProcessData publi Int32 Id { setpublic String Name { setpubli Int64 WorkingSet { setpubli Int32 HandleCount { setpubli Int32 Threads { setpubli Int64 PrivateMemory { setpubli Int64 VirtualMemorySize { setpubli Int64 NonpagedSystemMemorySize { setUtilizamos la libreria using System.Diagnostics para hacer consultas de todos os procesos que estén en el servidor o PC. privat void button1_Click( object sender, RoutedEventArg var processes = n Li ProcessData >(); foreac var process Process. GetProcesses() var data = newProcessData                 data.Id = process.Id;                 data.Name = process.ProcessName;                 data.WorkingSet = process.WorkingSet64;                 data.HandleCount = process.HandleCount;                 data.PrivateMemory = process.PrivateMemorySize64;                 data.VirtualMemorySize = process.VirtualMemorySize64;                 data.NonpagedSystemMemorySize = process.NonpagedSystemMemorySize64;                 data.Threads = process.Threads.Count;                 processes.Add(data);             dataGrid1.DataContext = processes;

java development, aprendiendo java parte 1, LIBERTAD HUMANA

Así es amigos, este video es verídico. Os videos fueron grabados de diferentes ángulos. El chemstrail escrito  dice ?LAST CHANCE? (Última oportunidad). ¿Que se traman? Ojalá que estos desgraciados no estén planeando algo. !Ah! y otra cosa. Ya subieron algunos videos del mismo chemstrail, pero lo modificaron ?intencionalmente? para que cuando la gente busqué os videos, encuentre diferencias y diga.. ?todo esto es falso?. Son desinformadores a sueldo que ya tienen su recompensa en la tierra. Pobres de ellos, no saben lo que les espera.. Saludos y estar atentos. Se vienen muchas noticias, estamos en momentos cruciales Rocko

java development, aprendiendo java parte 2

EXTENSIONES DEFINICION: Referido a os nombres de os ficheros informáticos, conjunto de caracteres añadido a un nombre de archivo para definir su tipo o clarificar su significado. En el  sistema operativo MS-DOS, por ejemplo, un archivo puede tener un nombre de hasta ocho caracteres de expansión seguidos de un punto (.) y una expansión de hasta tres caracteres (letras o números). La expansión puede ser asignada por el usuario, por ejemplo MISDATOS.HOY, o bien puede venir impuesta por el programa, implicando una manera alguna de manejo; así las extensiones BAS pertenecen al lenguaje BASIC y las COM y EXE a  proyectos  ejecutables que se pueden cargar y ejecutar en MS-DOS. Se puede utilizar la expansión de os ficheros para seleccionar un conjunto de elos y hacer diversas  operaciones Ejemplo: Para actuar sobre una serie de ficheros de texto, se puede solicitar al  sistema  operativo que muestre sólo la lista de os ficheros que tienen expansión TXT (u otra, dependiendo del  procesador  de textos que se esté utilizando). En otros campos de la informática, una expansión también se puede mencionar a un juego extendido de códigos que se emplea para incluir caracteres adicionales en un conjunto de caracteres determinado. Ejemplo: IBM ofrece un conjunto de caracteres desarrollado que agrega 128 caracteres adicionales a os códigos ASCII estándar; es lo que se denomina  código ASCII extendido. En proyectoción, el término se puede mencionar a un proyecto o un módulo que añade funcionalidad o mejora el rendimiento de otro proyecto. NOMENCLATURA: Todos os formatos de archivo o extensiones están escritos en mayúscula en la columna de la izquierda. A su derecha y en la misma línea todos eos poseen una aclaración adjunta o bien os proyectos recomendados para su uso. Todas las extensiones más significativos y que necesitan una aclaración más completa y ampliadas en la parte final de su categoría correspondiente. TIPOS DE EXTENSIONES DE ARCHIVOS: DE SISTEMA Estos son os ficheros necesarios para el funcionamiento interno del Sistema Operativo así como de os distintos proyectos que laboran en él. No esta recomendado moverlos, editarlos o variarlos de ningún modo porque pueden afectar al buen funcionamiento del sistema. 386 Controlador de herramienta virtua ACA Microsoft  Agent Carácter ACG Vista previa de Microsoft Agent ACS Microsoft Agent Carácter ACW Configuración del asistente de Accesibilidad ANI Cursor animado BAT Archivo por lotes MS-DOS BFC Maletín BKF Copia de  seguridad  de Window BLG Monitor  del sistema CAT Catálogo de seguridad CER Certificado de seguridad CFG Configuraciones CHK Fragmentos de ficheros recuperados CHM Ayuda HTML compilado CLP Clip de Portapapeles CMD Secuencia de  comando  de Window   CNF Velocidad  de marcado COM Aplicación MS-DOS CPL Longitud del Panel de control CRL Lista de revocaciones de certificados CRT Certificado de seguridad CUR Cursor DAT Base de Datos DB Base de datos DER Certificado de seguridad DLL Librería, expansión de aplicación DRV Controlador de herramienta DS TWAIN Data Source file DSN Nombre del inicio de datos DUN Acceso telefónico de red EXE Aplicación FND Búsqueda guardad FN Grupo de fuentes FOLDER Carpeta FON Fuente GRP Grupo de proyectos de Microsoft HLP Ayuda HT Hyper Termina INF Información de instalación INI Opciones de configuración INS Configuración de  comunicaciones  de Internet ISP Configuración de comunicaciones de Internet JOB Objeto de tarea KEY Accesos de registro LNK Acceso directo MSC Documento de la consola general de Microsoft MSI Paquete de Windows Installer MSP Revisión de Windows Installer MSSTYLES Estilo visual de Windows NFO MSInf OCX Control  ActiveX OTF Fuente OpenType P7C Identificador digital PFM Fuente Type 1 PIF Acceso directo a proyecto MS-DOS PKO Objeto de seguridad de claves públicas PMA Archivo del Monitor de sistema PMC Archivo del Monitor de sistema PML Archivo del Monitor de sistema PMR Archivo del Monitor de sistema PMW Archivo del Monitor de sistema PNF Información de instalación precompilada PSW Password Backup QDS Directorio de consulta RDP Conexión a Escritorio remoto REG Accesos de registro SCF Windows Explorer Command SCR Protector de pantalla SCT Windows Script Component SHB Acceso directo a documento SHS Recorte SYS Archivo de sistema THEME Tema de Windows TMP Archivo temporal TTC Fuente True Type TTF Fuente TrueType UDL Vínculos a datos VXD Controlador de herramienta virtual WAB Libreta de direccione WMDB Biblioteca  multimedia WME Windows Media Encoder Session WSC Windows Script Component WSF Windows Script File WSH Windows Script Host Settings File ZAP Configuración de instalación de software GLOSARIO DE EXTENSIONES DE SISTEMAS .BAT: archivo de procesamiento por lotes de DOS. Se ejecuta abriendo una sesión de DOS y tipeando el nombre del archivo. .BIN: archivo con contenido de datos en formato de sistema binario, utilizado por muchos programas. .COM: archivo de comando de proyecto de DOS. Se ejecuta tipeando el nombre o haciendo clic sobre él. Windows abrirá una sesión de DOS y lo ejecutará. .DLL: archivo de librería de vínculo dinámico. Es una colección de pequeños proyectos que son invocados por otro proyecto más grande cuando es necesario. .DRV: archivo que interactúa con un herramienta o un proyecto específico. Contiene información sobre el herramienta o proyecto que el  software  que lo emplea no posee. .DUN: acceso telefónico a redes. Al realizar clic sobre este archivo, se accede a  Internet  mediante el número y el password especificado en el archivo. .EXE: programa autoejecutable. Se corre una vez que se hace clic sobre el archivo. . FON / .TTF:  archivos de  fuentes  (tipografías) de Windows..INI: archivo para empezar Windows. Contiene información sobre os herramientas y aplicaciones que se inician junto con el sistema operativo. .OCX: programa de control personalizado. Provee a Windows de  funciones  específicas, como el redimensionamiento de ventanas y scroll de la barra espaciadora. .REG: archivo de  registro  de Windows, en el cual se guarda la configuración de las aplicaciones instaladas. Si no eres experto, no lo abras .TMP: archivo temporal de  esfuerzo  de Windows. Lo emplea el sistema para efectuar  procesos  en el disco rígido y os borra una vez finalizado dicho proceso. .VXD: archivo de controlador virtual de Windows. Es indispensable para controlar os herramientas de la PC. .SYS: archivo de sistema, importante para que el sistema operativo funcione correctamente. Tampoco conviene abrirlo si no se conoce su funcionamiento interno. DE AUDIO Os ficheros de audio son todos os que contienen sonidos (no solo  música ). Las distintos extensiones atienden al formato de compresión utilizado para convertir el  sonido  real en digital. 669 Winamp AIF Winamp AIFC Formato AIFF AIFF Winamp AMF Winamp ASF Windows Media AU Winamp AUDIOCD AudioCD CDA Winamp CDDA AIFF Audio FAR Winamp IT Winamp ITZ Winamp LWV Microsoft Linguistically Enhanced Sound File MID Winamp MIDI Winamp MIZ Winamp MP1 Winamp MP2 Winamp MP3 Winamp MTM Winamp OGG Winamp OGM (Ogg) OKT Winamp RA Real Audio RM Winamp SND Winamp STM Winamp STZ Winamp ULT Winamp VOC Winamp WAV Winamp WAX Acceso directo de audio de Windows Media WM Windows Media WMA Winamp WMV Windows Media XM Winamp XMZ Winamp GLOSARIO DE EXTENSIONES DE AUDIO AU: archivo de audio comprimido debajo regla U-Law. Ya obsoleto, reemplazado por la regla MPEG y su popular formato de audio comprimido mp3 .CDA: pista de audio digital de un   de música. Haciendo clic sobre él se lanza el Reproductor de CDs de Windows. .MID: archivo de música MIDI (Interfase Digital de Instrumento Musical). El software de instalación de la mayoría de las  fichas  de sonido dispone de un módulo para ejecutar ficheros de sonido .mid. .MP3: archivo de audio comprimido debajo regla MPEG. Se ejecuta con aplicaciones como Winamp, Xing MPEG Player o Real Player, entre otros. .RA: archivo de sonido Real Audio. Se ejecuta con la aplicación Real Player. .SND: archivo de secuencia de sonido. Windows lo ejecuta automáticamente con su aplicación Rundll32. .WAV: sonido de onda de Windows, se puede abrir con la Grabadora de Sonidos de Windows. DE VIDEO Os formatos de video no sólo contienen imágenes sino también el sonido que las acompaña. Es bastante habitual que al intentar visualizar un vídeo no podamos ver la  imagen  aunque sí oigamos el sonido. Esto es debido al formato de compresión utilizado en eos que puede no ser reconocido por vuestro ordenador, por ello siempre se ha de tener actualizados os codecs de cada uno de os formatos. ASF Windows Media AVI BSPlayer BIK RAD Video Tools DIV DivX Player DIVX DivX Player DVD PowerDVD IVF Indeo M1V (mpeg) MOV QuickTime MOVIE (mov) MP2V (mpeg) MP4 (MPEG-4) MPA (mpeg) MPE (mpeg) MPEG (mpeg) MPG (mpeg) MPV2 (mpeg) QT QuickTime QTL QuickTime RPM RealPlayer SMK RAD Video Tools WM Windows Media WMV Windows Media WOB PowerDVD GLOSARIO DE EXTENSIONES DE VIDEO . ASF, .LSF, .ASX:  Archivo de secuencias de audio o video, se abre con el Reproductor  Multimedia  de Windows. .AVI: archivo de película de video de Microsoft Windows. Se abre con el Reproductor Multimedia de Windows. . MPA, .M1V, .MPG, .MPE, .MPEG:  archivo de video comprimido debajo regla MPEG. Se ejecuta con el Reproductor Multimedia de Windows, o con reproductores comerciales como el Xing MPEG Player. MOV, .QT:  archivo de video en formato de Quicktime. Se ejecuta con la aplicación Quicktime Player. . RM, RAM, .RV:  archivo de video en formato propietario de Real Video. Se ejecuta con Real Player. . DiVX:  archivo de video en formato DiVX:) conocido como el MP3 del video ya que faculta niveles muy altos de compresión. Logra que una película que ocuparía un DVD entero (de hasta 7 GB), pueda grabarse en un  CD-Rom  común (de 700 MB) sin perder  calidad COMPRIMIDOS Os formatos de compresión son de gran  utilidad  a la hora del almacenamiento de información ya que hacen que esta ocupe el menor lugar probable y que se puedan reunir muchos archivos en uno sólo. ACE WinACE ARJ WinARJ BZ IZarc / WinRAR BZ2 IZarc / WinRAR CAB CAB Station GZ IZarc / WinRAR HA IZarc / WinRAR ISO WinRAR LHA IZarc / WinRAR LZH IZarc / WinRAR R00 WinRAR R01 WinRAR R02 WinRAR R03 WinRAR R0 WinRAR RAR WinRAR TAR IZarc / WinRAR TBZ IZarc / WinRAR TBZ2 WinRAR TGZ IZarc / WinRAR UU WinCode / WinRAR UUE IZarc / WinRAR XXE IZarc / WinRAR ZIP WinZIP ZOO IZarc GLOSARIO DE EXTENSIONES DE Ficheros COMPRIMIDOS .RAR: archivo compactado con la aplicación WinRAR y extraíble con la misma, uno de os dos más populares formatos de archivo compactado en l web (el otro es .zip). .ZIP: archivo compactado con la aplicación  WinZip  y extraíble con esta aplicación. Es uno de os dos formatos de archivo de compactado más populares. El otro es .rar DE IMÁGENES Escaso hay que decir de las imágenes y de sus formatos salvo que cada uno de ellos emplea un  método  de representación y que algunos proporcionan gran calidad que otros. También cabe resaltar que muchos proyectos de  edición  gráfica emplean sus propios formatos de esfuerzo con imágenes. AIS ACDSee Secuencias de imagen BMP XnView / ACDSee BW XnView / ACDSee CDR CorelDRAW Grafico CDT CorelDRAW Grafico CGM CorelDRAW Grafico CMX CorelDRAW Exchange Graphic CPT Corel PHOTO-PAINT DCX XnView / ACDSee DIB XnView / ACDSee EMF XnView / ACDSee GBR The Gimp GIF XnView / ACDSee GIH The Gimp ICO Icono IFF XnView / ACDSee ILBM XnView / ACDSee JFIF XnView / ACDSee JIF XnView / ACDSee JPE XnView / ACDSee JPEG XnView / ACDSee JPG XnView / ACDSee KDC XnView / ACDSee LBM XnView / ACDSee MAC MacPaint PAT The Gimp PCD XnView / ACDSee PCT PICT PCX XnView / ACDSee PIC XnView / ACDSee PICT PICT PNG XnView / ACDSee PNTG MacPaint PIX XnView / ACDSee PSD Adobe Photosho PS Paint Shop Pro QTI QuickTime QTIF QuickTime RGB XnView / ACDSee RGBA XnView / ACDSee RIF Painter RLE XnView / ACDSee SGI XnView / ACDSee TGA XnView / ACDSee TIF XnView / ACDSee TIFF XnView / ACDSee WMF XnView / ACDSee XCF The Gimp GLOSARIO DE EXTENSIONES DE IMÁGENES .BMP: archivo de mapa de bits de Windows. Se ve con el accesorio de Microsoft Paint o con cualquier visor de  gráficos, como el ACDSee. archivo de diseño  de la aplicación  Corel Draw. Se ejecuta con la misma aplicación. .GIF: uno de os dos formatos de archivo de gráficos preferido en la Web (el otro es .JPG). Comprimido al idéntico que os .JPG, pero por otro sistema llamado LZW, patentado por Unisys. Se abre con cualquier visor de gráficos. .ICO: archivo de gráfico de ícono. Es utilizado por Windows para arrojar una aplicación con un clic sobre el mismo. .PCX: archivo de gráficos creado con PC Paintbrush, de Soft. Se abre teniendo instalada en Windows ésta aplicación. .PIC: archivo de gráficos de PC Paint. Se ejecuta con esta aplicación. .PSD: archivo de mapa de bits hecho con Adobe  Photoshop. Se ejecuta con esta aplicación o con un visor de gráficos, como ACDSee.. TGA: archivo de gráficos de alta definición hecho con  tarjeta de video  profesional Targa. Visible con adobe Photoshop o determinado visor de gráficos. .WMF: sigla de Windows Metafile. Ficheros que contienen información descriptiva respecto de un archivo de gráficos. Es el formato usado por las galerías de imágenes de Microsoft  Office. Pueden verse con un visor de gráficos o convertirse a otros formatos de gráficos con la aplicación Hijaak Pro. DE IMAGENES DE CD Para guardar en un archivo único lo incluido dentro de un CD se emplean las llamadas ?imágenes de disco?, su nombre proviene de que son exactamente iguales a lo guardado en el disco, como una imagen reflejada en un espejo. Con ellas se pueden realizar múltiples copias idénticas de un disco MDS Alcohol CCD Alcohol 120% / CloneCD CUE Alcohol 120% / CDRWin (+.BIN) ISO Alcohol 120% / Ahead Nero BTW Alcohol 120% CDI Alcohol 120% IMG CloneCD (también de diskette y  dibujo AHEAD NERO NRA Nero: CD audio NRB Nero: CD-ROM arranque NRE Nero: CD EXTRA NRG Ahead Nero NRH Nero: CD-ROM híbrido NRI Nero: CD-ROM ISO NRM Nero: CD mixto NRU Nero: CD-ROM UDF NRV Nero: CD supervídeo CDC Nero CD Cover DE TEXTO Dentro de los  documentos  de texto hemos de distinguir entre el texto plano y el enriquecido. Es decir, entre os formatos que Simplemente guardan las letras (txt, log...) y os que podemos asignarles un tamaño, fuente, color, etc, (doc). DIC Block de notas / WordPad DOC Microsoft Word DIZ Block de notas / WordPad DOCHTML HTML de Microsoft Word EXC Block de notas / WordPad IDX Block de notas / WordPad LOG Block de notas / WordPad PDF Adobe Acrobat RTF Microsoft Word SCP Block de notas / WordPad TXT Block de notas / WordPad WRI Write WTX Block de notas / WordPad GLOSARIO DE EXTENSIONES DE TEXTO .TXT: archivo de texto plano, sin gráficos. Se abre con cualquier editor de texto, incluido el Bloc de Notas, de Windows. .NFO: archivo de texto plano que suele incluirse como  descripción del contenido de un archivo compactado .zip. Se ve con cualquier editor de texto. . HTML / .HTM:  archivo de hipertexto, utilizado para la publicación de contenidos en la Web. Es un standard utilizado por os principales navegadores  de Internet. Sirve para abrir estos archivos: Internet Explorer y Navigator. .DIC:diccionario  para  procesadores  de texto. Se compone de texto plano y se abre como tal con cualquier procesador de texto. .DOC: archivo de texto con estilo. Se genera y se abre con os principales procesadores de texto para Windows: Microsoft Word, WordPerfect, Display Write, WordStar. .WRI: archivo de texto con estilo generado por el accesorio de Windows Microsoft Write. Accesible con este proyecto o con cualquier procesador de texto. .RTF: Forrmato de archivo de texto enriquecido que faculta intercambiar texto entre distintos  procesadores de texto  y en distintos  sistemas operativos. Accesible con cualquier  procesador de texto DE PROGRAMAS La mayoría de os proyectos tienen formatos de archivo propios para utilizaros en diferentes funciones. Al ser bastante habituales algunos de eos, detallamos os más significativos aquí. OPENOFFICE SDA Dibujo SDC Hoja de cálculo SDD Presentación SDS Diagrama SDW Texto SFS Frame SGL Documento maestro SMD Mail Document SMF Fórmula STC Plantilla de hoja de cálculo STD Plantilla de dibujo STI Plantilla de presentación STW Plantilla de texto SXC Hoja de cálculo SXD Dibujo SXG Documento maestro SXI Presentación SXM Fórmula SXW Texto VOR Plantilla QUICKTIME QPX Player Plugin QTP Preferentes QTS QuickTime QTX Longitud QUP Update Package POWERPOINT POT Plantilla POTHTML Plantilla HTML PPA Complemento PPS Presentación PPT Presentación PPTHTML Documento HTM WORDDOT Plantilla de Microsoft Word DOTHTML Plantilla HTML de Microsoft Word WBK Copia de seguridad de Microsoft Word WIZ Asistente para Microsoft Wor EXCELCSV Archivo de  valores  separados por comas DIF Formato de intercambio de datos DQY Ficheros de consulta ODBC XLA Complemento XLB Hoja de cálculo XLC Gráfico XLD Hoja de cuadros de diálogo XLK Archivo de copia de seguridad XLL Complemento XLL XLM Macro XLS Hoja de cálculo XLSHTML Documento HTML XLT Plantilla XLTHTML Plantilla HTML XLV Módulo VBA XLW Área de esfuerzo MEDIA PLAYER ASX Lista de  reproducción  de audio o vídeo WMP Archivo del Reproductor WMS Archivo de máscara WMX Lista de reproducción de audio o vídeo WMZ Paquete de máscaras WPL Lista de reproducción WVX Lista de reproducción de audio o vídeo MSN MESSENGER CTT Lista de contactos YAHOO MESSENGER YMG Messenger Class YPS Messenger Class DE INTERNET ASP Active Server Pages CSS Documento de hoja de estilos en cascada HTA HTML Aplicacion HTM HTML Documento HTML HTML Documento HTT Plantilla de hipertexto JS JScript Script File JSE JScript Encoded Script File JSP Archivo JSP MHT MHTML Documento HTML MHTML Document PHP Personal  Home Page SHTM Archivo SHTM URL HTML Documento XML HTML Documento XSL Hoja de estilos XSL EML Outlook / Eudora / The Bat MBX Eudora Mailbox MSG Mensaje E-mail NWS News Mensaje OTROSBIN Binario CLASS Jav C CPP CJAVA Java M3U Winamp playlist file MAX 3D Studio Max SPL Shockwave Flash Object SWF Shockwave Flash Object VBS Visual Basic Script Dejar un comentario

java development, aprendiendo java parte 3

En este artículo explicaremos el funcionamiento de la aplicación Jockey de Canaima, por algunos conocida como el detector automático de Hardware. Este proceso de detección se refiere a poder decidir de manera automatizada cuales herramientas tienen lugar en el sistema, decidir os controladores necesarios para que estos herramientas funcionen en Canaima e instalaros si el usuario lo solicita. Kernel de Linux y Soporte a Hardware Jockey actúa sobre os herramientas no soportados de manera automática por el Kernel de Linux Por lo común el kernel de Linux brinda soporte a la mayoría del Hardware que encontramos en un computador, y cuando hablamos de hardware hablamos de todo el hardware en común, no solo nos referimos a herramientas especiales. Por ejemplo, cosas tan simples como el teclado y el ratón son herramientas de hardware que os sistemas operativos deben reconocer y que usualmente no tomamos en cuenta que hay toda una porción de código fuente extendido para realizar funcionar estos herramientas tan básicos que a veces ni os notamos. Existe también otra porción de herramientas soportados que para otros sistemas operativos es difícil darles soporte y es indispensable que el usuario instale software de controladores para elos, pero en cambio el Kernel de Linux os soporta sin ningún tipo de acción adicional del usuario más que conectarlo al computador. Un caso ejemplar de esto son las Tarjetas de Sonido, que en otros sistemas operativos es indispensable activarlas instalando ?Drivers?, en cambio en Linux ya vienen activadas sin realizar cambios al sistema. De idéntico forma hay otro tipo de herramientas os cuales vienen marcados por masivos restricciones legales de Copyright (Derechos de Autor) y el escaso interés de os fabricantes de brindar soporte a Linux, por esta razón no tienen un soporte automático en Linux, sino que deben ser instalados controladores de software privativos adicionales, o simplemente no tienen soporte alguno. Este último grupo de herramientas de Hardware son os que Jockey detecta y decide automáticamente si necesitan la instalación de software adicional. Módulos y Firmware Existen dos tipos de Software indispensables para que un herramienta de hardware sea soportado por el Kernel de Linux, se trata de os Móduos del Kernel y el Firmware para el herramienta. Para que el hardware funcione correctamente es indispensable uno de elos, en algunos casos y la mezcla de ambos en otros. Módulos Se lee en la Wikipedia: ?En computación, un módulo cargable del núcleo es un archivo que contiene código objeto que puede expandir el núcleo en ejecución (también llamado núcleo base) de un Sistema Operativo. La mayoría de os sistemas estilo Unix soportan móduos cargables en el núcleo (Kernel). Os módulos cargables en el núcleo son generalmente utilizados para brindar soporte a nuevos herramientas de Hardware y Sistema de archivos, así como para añadir llamadas al sistema. Cuando la funcionalidad provista por un módulo del núcleo deja de ser requerida, usualmente éste puede ser descargado, liberando su memoria.? Firmware Nuevamente consultando a la Wikipedia: ?El firmware es un bloque de instrucciones de máquina para objetivos específicos, grabado en una memoria, usualmente de lectura / escritura (ROM, EEPROM, flash, etc), que constituye la lógica de más debajo nivel que controla os circuitos electrónicos de un herramienta de cualquier tipo. Está fuertemente formado con la electrónica del herramienta siendo el software que tiene directa interacción con el hardware: es el encargado de controlarlo para ejecutar correctamente las instrucciones externas. En resumen, un firmware es el software que maneja al hardware. Funcionamiento de Jockey En Canaima, el detector de hardware está compuesto por tres fundamentos principales: El Backend El Device Monitor La interfaz de Usuario Estos tres fundamentos actúan en dos capas, una capa de sistema (root) y otra capa de usuario. Diagrama del comportamiento de Jockey. El kernel notifica al Device monitor a través de UDEV la presencia de un dispositivo. El Device Monitor dispara Backend para realizar el chequeo de controladores a través de DBus. Si faltan controladores se disparan las notificaciones y a través de estas se llama a la Interfaz gráfica de usuario quien interactuará despues con el Backend a través de DBus para realizar la instalación Backend El Backend de Jockey es la pieza central de todo el proceso de detección del hardware. Este interactúa a directamente con el kernel y os móduos del mismo, haciendo las consultas y procedimientos necesarios para decidir os herramientas de hardware presentes en el sistema. Igualmente es el Backend el que se encarga a través de os ?Handlers? de activar o desactivar os controladores para dichos herramientas detectados. Cabe resaltar que cuando hablamos de herramientas detectados en esta sección, hablamos únicamente de aqueos en que pudo determinarse la ausencia de controladores, todos os demás herramientas a os cuales el Kernel da soporte automático son obviados. Device Monitor La función del Device monitor es, como su nombre lo indica, es monitorear en tiempo real la inserción de nuevos herramientas de hardware en el sistema. Esto lo logra interactuando con UDEV quien le reporta cuando un herramienta ha sido conectado o desconectado del sistema. Interactúa en conjunto con el Backend a través de un canal de comunicación DBus, por recurso del cual el Device Monitor informa al Backend que un nuevo herramienta ha sido conectado, y por el cual el mismo Backend informa al Device Monitor si el herramienta necesita controladores o no. Si un herramienta es detectado como ?Sin controladores? entonces el Device Monitor se encarga de liberar las notificaciones al usuario a través de la librería libnotify y a por recurso de estas notificaciones el usuario puede alzar la interfaz gráfica para determinar qué realizar con el herramienta detectado. Interfaz de Usuario Interfaz Gráfica GTK de Jockey La interfaz de usuario es la apoderada de mostrar al usuario la lista de herramientas que Jockey a detectado, ya sea para activarlos o desactivarlos. Igualmente proporciona detalles del herramienta y del controlador que será instalado y asimismo proporciona la alternativa de ignorar las notificaciones referentes a un herramienta en particular. La activación y desactivación de os herramientas la logra esta interfaz gráfica interactuando directamente con el Backend a través de un canal DBus por el cual se envían y se reciben las señales desde y hacia el Backend. Activación de os Controladores La activación de os controladores a través de Jockey se producen a través de dos dispositivos provistas por esta aplicación, estas son os Handlers y las sobreescritura de Modaliases Handlers (Manejadores) Son piezas de código Python en manera de Clases, que vienen en varios tipos dependiendo de la manera de instalación de os controladores. Os Handlers contienen en su código os métodos necesarios para realizar la activación o desactivación del herramienta en el sistema. Ejemplo de un Handler import logging impor los import subprocess from jockey.oslib import OSLib from jockey.handlers import FirmwareHandler, KernelModuleHandler class IntelCentrinoN1000FirmwareHandler(FirmwareHandler): def __init__(self, ui): self._free = False FirmwareHandler.__init__( self, ui, 'iwlwifi' '/lib/firmware/iwlwifi-1000-5.ucode' 'Firmware for Intel Centrino-N 1000 wireless' ) self.package = 'firmware-iwlwifi' self._auto_install = False self.needs_kernel_headers = False# The iwlwifi module needs to be unloaded then reloaded # to activate the device. Rebinding doesn't work self._do_rebind = Fal def enable(self): logging.debug( 'Going to reload module %s' % (self.module, )) subprocess.call([OSLib.inst.modprobe_path, '-r', self.module]) r = KernelModuleHandler.enable(self) subprocess.call([OSLib.inst.modprobe_path, self.module]) return r def disable(self): logging.debug( 'Removing module %s' % (self.module, )) subprocess.call([OSLib.inst.modprobe_path, '-r', self.module]) return KernelModuleHandler.disable(self) Sobreescritura de Modaliases Son pequeños ficheros de texto que vinculan os identificadores de un herramientas (IdVendor, IdProduct) con un módulo particular y con un paquete de software presente en el repositorio. Estos Modaliases sobreescritos, son procesados por Jockey y convertidos automáticamente en Handler, es decir, son convertidos a código Python entendible por el Backend quien despues se encargará de realizar os llamados a os métodos correspondientes. Si un herramienta es declarado en sdeterminados de estos ficheros de sobreescritura de Modaliases, entonces el Backend se encarga de decidir si el módulo indicado está presente en el sistema, y si no es así, entonces instala el paquete de software señalado por este archivo. Ejemplo de un archivo Modaliases para Jockey # Realtek alias pci:v10ecd8192* rtl8192se firmware-realtek alias pci:v10ecd8171* rtl8192se firmware-realtek alias pci:v10ecd8172* rtl8192se firmware-realtek alias pci:v10ecd8173* rtl8192se firmware-realtek alias pci:v10ecd8174* rtl8192se firmware-realtek Otro ejemplo de archivo Modaliases: # Information from reset ath9k_htc # Atheros alias usb:v0CF3p7010d*dc*dsc*dp*ic*isc*ip* ath9k_htc firmware-atheros alias usb:v0CF3p7015d*dc*dsc*dp*ic*isc*ip* ath9k_htc firmware-atheros alias usb:v0CF3p9271d*dc*dsc*dp*ic*isc*ip* ath9k_htc firmware-atheros # Azureware alias usb:v13D3p3327d*dc*dsc*dp*ic*isc*ip* ath9k_htc firmware-atheros alias usb:v13D3p3328d*dc*dsc*dp*ic*isc*ip* ath9k_htc firmware-atheros # D-Link alias usb:v07D1p3A10d*dc*dsc*dp*ic*isc*ip* ath9k_htc firmware-atheros # LiteOn alias usb:v04CAp4605d*dc*dsc*dp*ic*isc*ip* ath9k_htc firmware-atheros # Netgear alias usb:v0846p9030d*dc*dsc*dp*ic*isc*ip* ath9k_htc firmware-atheros alias usb:v0846p9018d*dc*dsc*dp*ic*isc*ip* ath9k_htc firmware-atheros # Panasonic alias usb:v04DAp3904d*dc*dsc*dp*ic*isc*ip* ath9k_htc firmware-atheros # SMC alias usb:v083ApA704d*dc*dsc*dp*ic*isc*ip* ath9k_htc firmware-atheros # Sony alias usb:v0411p017Fd*dc*dsc*dp*ic*isc*ip* ath9k_htc firmware-atheros # TP-LINK alias usb:v0CF3p1006d*dc*dsc*dp*ic*isc*ip* ath9k_htc firmware-atheros Referencias https://es.wikipedia.org/wiki/M%C3%B3dulo_de_n%C3%BAcleo https://es.wikipedia.org/wiki/Firmware#El_firmware_hoy_en_d.C3.ADa 3 octubre, 2013 Deja un comentario

java development, aprendiendo java parte 5

SE REALIZA EL ACTO POR EL ?DIA DEL VETERANO Y DE Os CAIDOS EN LA GUERRA DE MALVINAS? La Municipalidad de Chascomús recuerda que en virtud de la recordación del ?Día del Veterano y de os Caídos en la Guerra de Malvinas?, se realizarán actividades con una vigilia y el acto oficial de recordación. Para este lunes 1º de abril desde las 22, se ha contemplado la realización de la Vigilia desde las 22, en la plazoleta donde se emplaza el monumento frente al Edificio del Turista y que es organizado por el grupo de Ex Combatientes de Malvinas de vuestra ciudad, culminando a la medianoche con la entonación del Himno Nacional. El martes 2 de abril se llevará a cabo en el mismo lugar, desde las 10,30 el acto oficial con la próximo programación: Izamiento de la Bandera Nacional. Himno Nacional Argentino a cargo de la Banda Municipal de Música dirigida por el prof. Jaime Lareu. Minuto de mutismo en homenaje a os caídos en la guerra. Colocación de ofrendas florales. Oración a cargo del Obispo Diocesano de Chascomús, Monseñor Carlos H. Malfa. Descubrimiento de una placa con una poesía escrita por Juan Miguel Vian. Palabras a cargo del ex combatiente Luis La Mantía. Palabras del Secretario de Infraestructura y Servicios, Daniel Giacobone. Lectura de la poesía ?Flores Lejanas? de Graciela Oroño por estudiantes de 2º año de la Escuela Vuestra Señora de Luján. Canción a cargo de alumnos de la Escuela Nº 27 de Comandante Giribone. Luego ingresará la bandera de 36 metros de largo donada por familias de Chascomús agregándose este año un nuevo sector por fracción del Club de Leones. El acto finalizará con la Marcha de Malvinas a cargo de la Banda Municipal de Música y el retiro de las banderas de ceremonia. NUMEROSOS VISITANTES RECORRIERON LA CARPA DE Os MICROEMPRENDEDORES Hace saber la Secretaría de Turismo y Producción, por intermedio de la Dirección de Producción, que con mayor éxito se desarrollaron la actividades previstas en la Micro Expo que se realiza mientras el presente fin de semana, en el bulevar situado en Avda. Presidente Perón entre Córdoba y Venezuela. La presenta estará libre mientras os días domingo, lunes y martes de 11 a 20 y en esta ocasión, se encuentran presentes, demostrando y ofreciendo sus artícuos y servicios, os próximos microemprendedores: Idearte (maquillaje artístico), Bruja y Brujitas (bijouterie), Lorena Ganuza (cactus y suculentas), Las Tunitas (Vivero), Jugar x Jugar (animación de eventos), Fitoamarilis (aceites, esencias y fitocosmética), A.Na (lencería), Anmora (ropa de chicos), Andrea Ojeda (telar), Cosas de Casa (productos de fibrofacil), Chocolates Artesanales Chascomús (chocolatería), ESARCO (jabones artesanales), Piedra, Papel y Tijera (juguetes de madera), Floripondias (accesorios de cuero), Arte Realeggza (huevos decorados), DAI (bijouterie y accesorios), Graficana (diseño gráfico ? productos personalizados), Reina de Java (bijouterie y accesorios), Caminos del Sur (productos de miel), Manos Rancheras (dulces) y Productos Ro.Ca. (panificados artesanales). HORARIOS DEFINIDOS EN Os CONSULTORIOS EXTERNOS DEL HOSPITAL SAN VICENTE DE PAUL Desde la Municipalidad de Chascomús se informa sobre las diferentes especialidades y sus días y horarios de vigilancia en os nuevos consultorios externos del Hospital Municipal San Vicente de Paul, una vez concretada la inauguración del tramo dedicado a este servicio. Salud mental: Psiquiatría: miércoles a dividir de las 9 y lunes a las 14. Psicología adultos: lunes 13 y 13,30; martes: 8,30, 13, 13,30 y 14,30; miércoles: 8, 13,30 y 14,30; jueves 13,30 y 14,30. Psicología Infantil: Lunes a las 8 y a las 10; martes a las 10; miércoles a las 10; jueves a las 8 y a las 10; viernes desde las 8. Traumatología y Ortopedia: de lunes a viernes a las 10. Cardiología: lunes a dividir de 7,30, martes y miércoles a las 9 y viernes a las 7,30. Electrocardiografía: lunes a las 7, martes y miércoles 8,30 y viernes desde las 7. Kinesiología: lunes, miércoles y viernes a las 9 y a las 15. Otorrinolaringoligía: Jueves a las 11. Servicio de nutrición: lunes a las 10,30 y 15; viernes a las 16. Odontología: por la mañana de lunes a viernes a las 8 y por la tarde: lunes, miércoles, jueves y viernes a las 13. Ginecología  y Obstetricia: Miércoles y jueves a las 8 y por la tarde de lunes a viernes a las 16. Clínica Médica: lunes 8,30; 10 y 13; martes a las 8; miércoles: 8; 8,30 y 13; jueves y viernes a las 8. Neurología adultos: jueves 14,30. Neumonología: martes a las 8 y a las 14; jueves a las 14. Pediatría: de lunes a viernes a las 9 y os miércoles y viernes desde las 13. Cardiología Infantil: martes a las 12. Neurología Infantil: miércoles 13. Neumonología infantil: martes a las 15. Fisiatría: días jueves a las 9 cada 15 días. Diagnóstico por imagen: de lunes a viernes de 7 a 18. Radiología General: lunes 7,30 y 9,30, martes a las 8, miércoles 7 y 9,30, jueves a las 8 y 10 y viernes a las 8. Ecografía y mamografías: lunes y martes a las 12. Urología: Lunes y viernes a las 8. Cirugía general: lunes a las 11 y viernes a las 9. Fonoudiología: lunes a las 12 y 14 y os martes a las 9. Oncohematología: miércoles a las 10. EN EL PARQUE DE Os LIBRES DEL SUR SE OFRECE UN ESPECTACULO La Secretaría de Turismo y Producción de la Municipalidad de Chascomús, recuerda que este lunes 1º de abril a dividir de las 14, se desarrollará un interesante evento que incluye un atractivo show musical con artistas en vivo que abarcarán diferentes géneros musicales. Es la ?Primera Fiesta de la Radio FM Sonar 93.9? en el Parque de os Libres del Sur, donde habrá peloteros, stands y cantina; pochocos, baños públicos actuando el payaso ?Felipe Nomeacuerdo?. Cabe señalar que también estará presente Mateo Salinas ofreciendo ?Arte y Pintura en Vivo?, y se realizarán variados rifas de artículos de firmas comerciales, quienes se suman para realizar probable la jornada destinada a toda la familia. Por su parte, la señora Moraima Leiza hará la presentación de ropa étnica y actuarán sobre el escena que se montará para la oportunidad: el cantor surero ?Gerardo Yanini?, Diego Fortes, Os Gauchiflados con un espectáculo humorístico, Néstor Ortiz y su acordeón de Dolores, Fatiga, Ledezma ?Tango?, Grupo Costumbres, Revancha con cumbias, Deep Blue, Grupo Manantiales con ritmo de cumbia, La Piesa y un show de rock, Cumbia Envase y de Pila llega el joven cantante Daniel Doufau, para interpretar un variado repertorio en lo mejor de su voz. El sonido y la iluminación, estarán a cargo del señor Maximiliano Díaz de la compañía ?Sonar Producciones Chascomús? HABRA RECOLECCION DE RESIDUOS TODOS Os DIAS Desde la Secretaría de Infraestructura y Servicios Municipal, se informa que mientras este fin de semana largo la recolección de residuos no ha sufrido alteraciones, habiendo quedado establecidos os días y horarios habituales para la recolección. En el mismo sentido, y para mantener la ciudad en las mejores cláusulas de aseo siendo días en os que se recibe a numerosos visitantes que han elegido Chascomús como la alternativa donde pasar el fin de semana y feriados que se extenderán hasta el martes, en la zona ribereña y lugares verdes cercanos, una cuadrilla de funcionarios pertenecientes a la mencionada cartera, realizan tareas de limpieza toda vez que se acercan y proporcionan bolsas de residuos a quienes descansan y aprovechan a orillas del espejo lacustre, para que os mismos sean depositados en ellas y no queden esparcidos en la ciudad. Cabe señalar que asimismo se encuentran como siempre, os cestos correspondientes para la disposición final de os mismos, en el tramo costero. Se debe añadir que en os distintos barrios, el camión recolector de residuos domiciliarios circulará por la mañana, en el instituto de la ciudad lo hará con una pasada a las 2 de la mañana y en la zona turística a la madrugada, en tanto que en estos dos tramos se contará con servicio especial de barrido. No obstante, se recomienda a todos os vecinos contemplar especialmente esta situación para ubicar las bolsas de residuos en os espacios y horarios apropiados, asimismo de informar que se solicita especialmente, no depositar escombros ni ramas en la camino pública ya que no se contará con este servicio mientras estos días. SE DESARROLLA ESTE DOMINGO LA ?1ª VUELTA DE CHASCOMUS Con el auspicio de la Secretaría de Turismo y Producción de la Municipalidad de Chascomús se llevará a cabo este domingo, la ?1ª Vuelta de Chascomús?. Este evento contará con un centenar de automóviles, y se contempla que a las 8, os vehícuos se ubicarán frente al Palacio Municipal, en exhibición. Se trata de os distintos automóviles de competición de diferentes épocas que horas más tarde harán un recorrido por la calle Libres del Sur hasta Mazzini, despues por Belgrano hasta llegar a la Avda. Lastra y desde ese espacio hasta la sede de la oficina de Turismo sobre Avda. Costanera España, frente al espigón ?Domingo Cazaux?, para hacer la ?largada? oficial y la vuelta simbólica sobre el sendero de circunvalación. Al finalizar la vuelta alrededor de la laguna, os automóviles quedarán una vez más en exposición pero esta vez sobre el Parque de os Libres del Sur, espacio donde se emplazará una carpa VIP. Habrá además, stand comerciales, de la policía, de Bomberos Voluntarios, de la Secretaría de Turismo y Producción Municipal, patio de comidas, y muchos atractivos más, os cuales han sido pensados desde la organización general. Cabe señalar que también manera fracción de este significativo atractivo, un excelente show musical donde se presentarán os próximos grupos: Ley Primera, Anexo y La Nueve. Desde la Secretaría de Turismo y Producción se invita a toda la comunidad a sumarse a este impactante espectáculo pensado para toda la familia lugareña y para quienes deciden realizar de vuestra ciudad, su destino turístico. EL INTENDENTE MUNICIPAL EN LA APERTURA DEL PERIODO DE SESIONES ORDINARIAS El Intendente Municipal, Cdor. Juan Alberto Gobbi, pronunciará el miércoles venidero a las 11, el discurso de apertura del período de sesiones ordinarias del Concejo Deliberante de Chascomús. El Jefe Comunal ha sido invitado por las autoridades de dicho cuerpo para hacer la apertura y en la oportunidad, el Cdor. Gobbi dará a conocer lineamientos de la política de su acción de gobierno para el año en curso. VENCIMIENTO DE TASAS DURANTE EL MES DE ABRIL Informa la Municipalidad de Chascomús, por intermedio de la Dirección de Ingresos Públicos, que el siguiente miércoles 3 de abril, se producirá el vencimiento de las próximos tasas: Segunda cuota de la Tasa por Alumbrado, Barrido y Limpieza. Segundo bimestre de la Tasa por Inspección de Seguridad e Higiene. Segunda cuota ALPEM, Alumbrado Público. Derechos de Cementerio, conservación y limpieza. El pago de estos tributos podrá efectuarse en el Palacio Municipal, en el horario comprendido entre las 7,30 y las 13,30 y en os restantes puntos de cobro habilitados a tal efecto. SE REALIZO LA PRESENTACION DE Os Lugares CREATIVOS Informa la Municipalidad de Chascomús que mientras la tarde del último miércoles, en el Teatro Municipal Brazzola se llevó adelante la presentación de  os talleres pertenecientes a os Lugares Creativos Municipales. Con la presencia del Secretario de Planificación y Desarrollo, Arq. Rodolfo Pertusi, la Directora Común de Gestión Cultural y Patrimonial, Lic Gabriela Grisendi, la Directora de Patrimonio Histórico, Mlga. Alejandra Bilbao y la Coordinadora de Longitud Cultural, Mónica Sanucci, se dio origen a la jornada oficial de presentación de lo que serían os talleres para el año 2013. Alejandra Bilbao agradeció a os presentes por sumarse a esta iniciativa municipal que busca y crea lugares donde cada uno de os asistentes logra sacar lo mejor de si para colocar en juego habilidades, ingenio, capacidad y creatividad. Seguidamente la Lic. Gabriela Grisendi señaló, entre otras cosas, que estos lugares creativos son una presenta de que este siglo XXI contiene lugares de diálogo, de encuentro, de reflexión y de compromiso social. También enumeró cada uno de os talleres que a lo largo del 2013 estarán funcionando en  os diferentes barrios de Chascomús, destacando que es un compromiso del gobierno local actual, estar cerca de os vecinos, interactuar y descubrir lugares comunes de encuentro y diálogo permanente. Grisendi mencionó además, un proyecto movible que se realiza en os barrios locales, cada 15 días, denominado ?De esquina a esquina y de mate en mate?, este es organizado desde Gestión Cultural y acompañado por la Dirección Municipal de Deportes. Un toque más de color y calidez os dieron os integrantes del Taller de Teatro Integrado, quienes subieron al escena con música y carteles indicadores conteniendo en detalle el listado de lugares creativos entere os que se contaron: Dibujo y pintura, Artesaplicadas y nuevas tendencias, Teatro adultos, Trenzado en cuero, Guitarra criolla, Tango, Folclore, Cantoría municipal, Pintura decorativa, Coro de niños, Teatro niños y adolescentes, Ideas en colores y Teatro Integrado. Cabe resaltar que os lugares creativos comenzaron a funcionar en el año 2000 y que se han mantenido a lo largo de más de una década surgiendo desde el 2012 con más fuerza y gran convocatoria, dado que os vecinos de vuestra ciudad, prefieren estas alternativas para construir y colocar en valor sus talentos. Tras las palabras del Profesor de os talleres de Tango y Folclore, Eduardo Suárez, quien contó la grata experiencia de os lugares que dirige y su interacción con la Banda Municipal de Música, ésta fuese la apoderada de colocar el ?broche de oro?, colmando la noche de alegría, emociones y diversión convocando a os estudiantes de os talleres municipales de tango y folclore a danzar, os cuales sin demorarse, mostraron las habilidades obtenidas en estos lugares creativos y de esta forma cerró una jornada que invitó a os chascomunenses a escoger entre una variedad de alternativas artísticas disponibles para el año en curso. Debe puntualizarse además, que os interesados en beber fracción de estas actividades, pueden realizarlo en el Teatro Municipal Brazzola, en tanto que próximamente se darán a conocer detalladamente os horarios y sedes de cada una de las actividades que se concreten. SE COLOCARON EL JUEVES CUATRO NUEVAS CAMARAS DE SEGURIDAD EN LA CIUDAD Informa la Municipalidad de Chascomús que el último jueves, se inició la labor de colocación de cuatro cámaras de seguridad en distintos puntos de la ciudad, siendo las mismas, fracción del equipamiento donado por la Cámara de Comercio, Industria y Servicios de Chascomús. De las diez cámaras aportadas por felicidad entidad, se instalaron os equipos en la intersección de Avda. Juan de Rosas y Misiones, en calle Libres del Sur y Pedro N. Escribano, en Avda. Costanera Pedro Urruty y Tucumán y en la esquina de Machado y Fernando de Arenaza, contemplándose para os siguientes días la coloración de las seis cámaras restantes. Dicho equipamiento ha sido instalado por técnicos de la compañía Intel Plast, de acuerdo al convenio suscripto oportunamente, y que posibilitará crecer las cámaras disponibles para os controles de seguridad en vuestra localidad. Debe consignarse que las cámaras instaladas se encuentran en período de prueba y ajustes, para su habilitación definitiva y las mismas se sumarán a las existentes, que faculta el monitoreo en dependencias municipales del tránsito en diferentes tramos de la ciudad, ubicándose las mismas, en espacios predeterminados, de acuerdo al informe oportunamente producido por las autoridades de seguridad de la ciudad, y que despues fuese aprobado por os integrantes del Foro Municipal de Seguridad. Al respecto, la Municipalidad de Chascomús agradece una vez más a las autoridades de la Cámara de Comercio, Industria y Servicios de Chascomús, por el significativo aporte de este moderno equipamiento dedicado a la seguridad en la localidad. Trascendental PRESENCIA DE TURISTAS DURANTE EL FIN DE SEMANA LARGO Comunica la Secretaría de Turismo y Producción, acerca de un primer relevamiento efectuado en vuestra ciudad, donde se obtuvieron os primeros datos relacionados con la ocupación turistica en os distintos establecimientos habilitados. Al respecto, se debe indicar que como se prevée fácilmente, la ciudad ha sido elegida por un muy significativo número de visitantes como instituto turístico desde el jueves pasado, situación que se reitera diariamente, a tal punto que la capacidad de hoteles, cabañas y Apart se cubrió inclusive con bastante anticipación. Por otra pare, se puede informar la presencia de familias y contingentes de excursionistas que se acercan a Chascomús para disfrutar de su laguna y otras alternativas, y lo hacen mientras una jornada para volver a sus hogares. Se considera que la situación se mantendrá con las mismas características mientras os siguientes días, en virtud de os alcances del feriado. CONTINÚA ABIERTA LA INSCRIPCIÓN A JORNADAS DE CAPACITACION EN EL MUSEO PAMPEANO Desde la Dirección Común de Gestión Cultural y Patrimonial se invita a todas las personas interesadas a participar de la capacitación gratuita que se dictará a dividir del viernes 19 de abril, en el Museo Pampeano. Tal como oportunamente se anticipara, estas jornadas están a cargo de profesionales de la Universidad de Buenos Aires y se designan ?El pasado indígena en la escuela: Prejuicios y categorías de análisis?. El Grupo Arqueología en las Pampas aúna os trabajos y las experiencias de tres equipos de investigación arqueológica con el meta de socializar el conocimiento generado a dividir del estudio del patrimonio arqueológico. Se trata de una red de arqueólogos y antropólogos de la provincia de Buenos Aires comprometidos con la transferencia de conocimientos que aparecen de os esfuerzos de investigación extendidos desde hace 30 años. Atendiendo la permanente demanda de información desde el entorno educativo, decidieron elaborar una nueva dispositivo didáctica: un DVD interactivo publicado por la Editorial de la Facultad de Fiosofía y Letras, UBA: Sobre os primeros pobladores de la pampa bonaerense. Apuntes de arqueología para llevar a la escuela. Se propuso hacer su distribución gratuita acompañada por la realización de un taller para docentes de las escuelas Primaria y Secundaria. Hay que puntualizar además, que el mencionado curso ? taller se aprobó debajo la Res. CD 2974 del 25 de noviembre de 2009. En esta oportunidad el Museo Pampeano, brinda sus instalaciones para construir estas jornadas, pudiendo inscribirse de lunes a viernes de 10 a 15 o telefónicamente al 43-0982, en el mismo horario. EXITOSO DESARROLLO DE UN CONCURSO DE PESCA Informa la Dirección Municipal de Deportes que con mayor éxito, se desarrolló el último viernes el torneo de pesca en las inmediaciones del Monolito. Debe destacarse que más de 60 participantes que iban desde os 5 hasta adultos fueron fracción de esta competencia que comenzó a las 14. La modalidad empleada, fuese la de pesca diversa a la gran porción de piezas con devolución de las mismas a la laguna. En cuanto a os frutos registrados en este concurso fueron os siguientes: Categoría hasta 12 años con mojarrera: 1º Augusto Clerc Renaud 2º Francisco Sanucci Categoría hasta 12 años con reel: 1º Francisco Nogueira 2º Alan Fontana 3º Nicolás Orbe 4º Patricio Román 5º Lucas Silva Categoría de 14 a 16 años 1º Juan Alonso 2º Matías González 3º Enzo Videla 4º Emiliano Varela 5º Agustín Chambers Categoría de 16 a 18 años 1º Brian Burgos Categoría más de 19 años 1º Juan José Nogueira 2º Esteban Nogueira 3º Sergio Orbe. La Dirección Municipal de Deportes agradece a todos os que participaron entre os que había pescadores locales y turistas y especialmente a os padres que acompañaron a sus hijos e hicieron del torneo una actividad para toda la familia. Categorías: Uncategorized

java development, aprendiendo java parte 1

Cuando era chico y estaba aburrido -casi siempre- me inventaba un juego, el cual radicaba en que andaba por la casa buscando objetos hasta que escogía una característica de algo que me gustaba: el color de algo, su textura, su olor? y con fundamento en esa característica me ponía a comparar os objetos que tenía a mi alrededor, y os diferenciaba entre sí. Veía que característica era la que ganaba al final. En una ocasión, para desmayo de mis padres, la característica fuese la resistencia de os objetos a un impacto tras una trayectoria de varios metros. Descubrí que las jarras, floreros y la colección de discos de vinil no eran resistentes? Durante mi infancia, siempre pensé que era un juego ingenioso, hasta que me di cuenta que es un proceso natural de cualquier ser humano, y que seguramente es el que nos distingue del resto de la fauna de este planeta: la clasificación de objetos. Clasificando al mundo En efecto, la clasificación de un objeto necesita un nivel de abstracción. Clasificar implica beber un atributo general de un conjunto de objetos, y compararos con otros objetos. Así, por ejemplo, poseemos una mesa de madera, una vasija con agua y una llanta de auto. Yo podría decir que tanto la mesa como la botella son productos caseros que se encuentran en cocinas, y distinguirlo de la llanta, la cual no es un producto doméstico. En este caso, estoy clasificando os objetos por su utilidad en el hogar. Claramente la mesa y la vasija son útiles en el hogar, y se aguarda que estén ahí por lo mismo. Sin embargo, si entro a la cocina y veo una llanta sobre la barra, no me hará mucho sentido: una llanta no tiene sentido en un hogar. La clasificación está extendidísima en el quehacer humano. Os biólogos clasifican a os seres vivos en reinos. Os geólogos clasifican las eras de la Tierra, os historiadores clasifican os sucesos por períodos o etapas, os literatos clasifican las novelas por movimientos literarios, e inclusive os jóvenes de hoy (snif) clasifican su música por género. Esa capacidad de abstracción que poseemos nos da muchísimas ventajas, ya que que las clasificaciones nos facultan tratar objetos con atributos parecidas (y por tanto, dentro de una clasificación determinada) de manera idéntica. Así, conocemos que os mamíferos tienen ciertos comportamientos comunes, como la sociabilidad y la protección mutua. Por tanto, respecto a esto, podemos establecer lineamientos globales sin importar si tratamos con perros, leones o humanos. Por otra parte, también podemos abstraer comportamientos. Por ejemplo, todos os mamíferos tienen el comportamiento de comer, aunque la manera de realizarlo varíe: el león probablemente cazará a su presa y la comerá cruda, entretanto que el perro esperará a que su dueño le alimente con croquetas y huesos; el humano probablemente irá a determinado restaurante. Pero el comportamiento es el mismo: el comportamiento aplica al sentido o intención de la acción, no tanto a cómo ésta se lleva a cabo. Otro ejemplo: todos os animales tienen el comportamiento de respirar. Por tanto, dado que un pez, un cangrejo y una gaviota son animales, podemos asegurar que respiran. Sin embargo, el pez respira separando el oxígeno del agua que le rodea, entretanto que la gaviota coge el oxígeno disuelto del aire. El cangrejo hace ambos procesos, dependiendo de si se descubre en tierra o mar. Clasificando dificultades La abstracción y clasificación parecen ser una dispositivo poderosa. De hecho lo es tanto que la usamos también para la resolución de dificultades de todo tipo en vuestra vida cotidiana. Pensemos en determinado ejemplo. Un encargado de una fábrica de refrescos tiene que hacer variadas tareas. El área de planeación estratégica puede solicitarle que produzca más refrescos. El área de ventas puede solicitarle que le envíe refrescos a tal o cual supermercado. El área de calidad puede solicitarle que determinado lote de refrescos sea destruido, pues no pasó la prueba de control. Y por último, el área de almacén puede solicitarle que traslade un lote de refrescos de una ubicación a otra. ¿Qué pueden tener estas tareas en común? 1.- Todas las tareas implican realizar algo con refrescos. Os refrescos están agrupados por sabores y presentaciones, y por lotes (i.e. fecha de creación). 2.- Todas las tareas implican un movimiento contable de almacén. entrada, salida a tienda, salida a desperdicio y movimiento interno. 3.- Todas las tareas conllevan un movimiento financiero: crear refrescos significa que se gastará materia prima, por lo que el movimiento será un costo. Lo mismo el destruir un lote porque no pasó las pruebas de calidad. Por otra parte, la venta al supermercado significa un movimiento positivo, pues entrará dinero a la fábrica por concepto de ventas. Por último, el movimiento entre almacén genera un movimiento neutral, pues no se gasta ni recibe nada. 4.- Todas las tareas tienen una persona quien la solicita y se hace responsable, y otra que la ejecuta y se hace responsable de llevarla a cabo. 5.- Todas las tareas deben realizarse en un período contable válido y en horarios laborales válidos. Supongo que hay más, pero creo que con esas podemos ilustrar el tema. Si nosotros fuéramos el encargado de la fábrica, ¿qué podríamos hacer? Si no clasificamos, tendríamos que generar un proceso independiente para cada tarea. Pero no es el caso, podemos reutilizar si clasificamos bien. De entrada, consideremos cada una de las tareas como una orden. La orden debe tener tres propiedades: el nombre de quien la solicita y el nombre de quien es responsable de ejecutarla (por el punto 4). De idéntico forma, debe tener una fecha de origen y una fecha de fin (por 5). Por otra parte, deberá tener un objeto Inventario. El objeto Inventario es en verdad una lista que lleva el nombre de un refresco, su presentación y lote, y su cantidad. Todas las órdenes tienen esta lista, por tanto todas tienen un inventario. Finalmente, todas las órdenes deberán tener un comportamiento similar, llamado "hacer movimiento contable" y "hacer movimiento financiero". Ya con esto, podemos decir que poseemos cuatro tipos de órdenes: de trabajo, órdenes de venta, orden de salida a desperdicio y orden de traslado. Comparten ciertas propiedades comunes, como el inventario o os responsables. Pero es evidente que realizar un movimiento contable y realizar un movimiento financiero tienen implicados diferentes. Es decir, para os cuatro implica que van a afectar el inventario del almacén, y que van a afectar las finanzas de la fábrica. Pero para una orden de trabajo, implica que tendrán que gastar dinero en la producción , pero que ingresará nuevo artículo al almacén; para una orden de venta es lo contrario: sale artículo del almacén pero ingresa dinero a las arcas de la fábrica; la orden de salida a desperdicio es doble pérdida: sale material del almacén y no entra dinero en la billetera de la fábrica; por último, la orden de traslado mueve material, pero no sale ni entra, y no tiene movimiento financiero. El haber hecho esta clasificación ayudará en mucho al encargado de la fábrica. Por ejemplo, posiblemente tendrá que crear un formato para llevar el registro. Si no debiera clasificado habría hecho cuatro formatos: uno por cada tarea. Pero ahora sabe que puede usar el mismo formato con os responsables, las fechas y el inventario. Ahora, quizás tenga que crear una hojita para llevar el registro especial de cada orden, el equivalente a "hacer movimiento contable" y "hacer movimiento financiero", pues posiblemente tendrá que recolectar distintos firmas, etc. Respecto a políticas y procedimientos, podrá crear las generales, y sólo las propias para cada una de ellas, en espacio de crear una política y procedimiento para cada orden. Y así sucesivamente. Clasificando bits Hasta ahora hemos visto puros ejemplos de la vida real, aplicados a objetos físicos y a escenarios de uso en un negocio hipotético. Pero ¿y eso qué tiene que ver con la programación? Para responder esa pregunta, poseemos que hacer un poco de anécdota de la computación. Recordemos que el objetivo de una computadora es computar. Es decir, hacer operaciones que cuantifiquen. Entre estas operaciones, podemos computar valores lógicos y relacionarlos (i.e. álgebra booleana). Y gracias a esto, podemos hacer interpretaciones de hardware, lo cual se traduce en una instrucción a determinado dispositivo. Un conjunto de instrucciones, una tras otra, forman un programa. Lo que desprende de lo previo es que un proyecto es un conjunto secuencial de instrucciones. Podemos tener unas diez instrucciones secuenciales, y la computadora lee la primera, la ejecuta y devuelve un fruto; lee la segunda, la ejecuta y devuelve un fruto; lee la tercera? y así sucesivamente. Es perfectamente natural para una computadora: lo único que requiere es tener las sentencias, el hecho de que sean secuenciales es fracción inherente a su naturaleza: las computadoras no pueden pensar de otra forma. Se comen una sentencia, escupen el fruto y van por la siguiente. Así las cosas, pues es perfectamente natural y entendible que mientras años, cuando surgieron os lenguajes de programación, éstos se amoldaran a la manera de pensar de una computadora. Lenguajes como Cobol, Fortran y C redactan instrucción tras instrucción, una tras otra. Esto hizo imposible que el mismo código pudiera reutilizarse en más de un lugar. Esta necesidad provocó que salieran lenguajes estructurados, que facultan escribir subrutinas parametrizadas. Pero a pesar de esto, el hecho Seguid siendo el mismo: instrucción tras instrucción, todo secuencial: llamar a una subrutina tras otra, etc. El asunto de pensar en instrucción tras instrucción es que tras miles de líneas de código, inicia a hacerse difícil de administrar, y por tanto, el código se vuelve propenso a errores. Pero lo peor es que esta manera de pensar no es natural en un humano. ¡Pues claro: si nosotros pensamos clasificando! Para nosotros sería mucho más natural enfocar os asuntos de software mediante clasificaciones, en espacio de ejecutar tareas una tras otra. Estas necesidades son las que han provocado que surgieran os lenguajes orientados a objetos. En otras palabras, os lenguajes orientados a objetos deben permitir hacer clasificaciones. Por supuesto, os lenguajes modernos como Java o C# facultan mucho más que crear clasificaciones, pero es el motivador principal. En C# se clasifica formando -tatatáaaan- clases. ¡Así es! Las clases y estructuras, y en común os tipos de datos, son las dispositivos mediante las cuales creamos nuestras clasificaciones. Sin embargo, crear una clase no es suficiente, pues éstas, por sí mismas, no nos facultan crear vinculos de identidad. Relaciones de identidad Cuando hablábamos de os objetos y sus atributos y comportamientos, y cómo clasificaros, pasamos por algo un concepto muy importante: las relaciones. Aunque las mencionamos brevemente no ahondamos mucho en ellas. Pues bien, es el momento de hacerlo. Para poder clasificar, poseemos que comparar. Y para comparar, poseemos que relacionar propiedades y atributos, si no, no podríamos llevar a cabo la clasificación. Así, es significativo que nos detengamos un momento para estudiar este concepto. El primer tipo de relación, quizás el más sencillo, es el de asociación. La relación de asociación desea decir que un objeto conoce a otro. Por ejemplo, un vaso debe conocer a una mesa, pues es donde se posa. Una mesa, sin embargo, no necesariamente conoce un vaso. El segundo tipo de relación, más interesante, es el de la agregación. Es una relación de "x contiene un y". Por ejemplo, una computadora contiene un monitor, un teclado y un ratón. Otro tipo de relación, parecida a la agregación, es la composición. Ésta es una relación de "x está integrado por a, b y c". Por ejemplo, un automóvil está integrado por un motor, unas llantas, un chasis, etc. El último tipo de relación significativo es el de la identidad. Esta relaciona las propiedades de un objeto con otro y crea generalizaciones. Es una relación de tipo "x es un tipo de y". Por ejemplo, un auto es un vehículo, un autobús es un vehículo, y una motocicleta es también un vehículo. Por otra parte, un vehículo es una máquina, una computadora es una máquina. Por lo tanto, un automóvil es una máquina. Y así sucesivamente. Las vinculos de identidad quedan como anillo al dedo para todo lo que hemos visto. En efecto, podemos ver claramente que la clasificación que podemos realizar sobre ciertos objetos queda complementada cuando podemos realizar vinculos "x es un tipo de y". Más aún, según podemos ver en el ejemplo anterior, conforme establecemos vinculos de identidad, éstas se trasladan hacia encima y hacia abajo, y entonces manifestamos que hemos creado una jerarquía. Ejemplo: El ejemplo previo es un escaso somero, pero ilustra vincuos de identidad y una jerarquía de clases. Os animales, plantas y hongos son seres vivos, así que siempre que hablemos de un ser vivo, inferimos que es sdeterminados de estos tres (por lo menos). Comportamiento general de os seres vivos: vivir, reproducir, comer, morir. Luego, un insecto, un mamífero, un ave, molusco o pez son un tipo de animal. Os homínidos, canes y felinos son un tipo de mamífero. Un humano es un tipo de homínido, y un león, tigre y un gato son tipos de felinos. Pues bien, ya con clasificación y con vinculos de identidad entendidas, podemos volver a C#. En .NET, las vinculos de identidad se hacen mediante la herencia. Herencia en C# y .NET El concepto de herencia, que no es otra cosa que establecer una relación de identidad entre dos clases, es medular en la plataforma .NET y en general, en cualquier plataforma / lenguaje de programación enfocada a objetos. Junto con la encapsulación y el polimorfismo, conforman os pilares de la misma. En .NET cada lenguaje determina cómo implementar la herencia. En el caso de C#, se hace poniendo dos puntos tras el nombre de la clase, seguido del nombre de la clase con la cual deseamos establecer la relación. class ClaseDerivada : ClaseBase { ? Decimos que la clase con la que relacionamos es una clase fundamento de la actual, a la cual se le conoce como clase derivada. También se les conoce como clase generalizada y clase especializada, respectivamente. En C# y .NET, una clase tiene una y sólo una relación de identidad (si una clase no especifica su clase base, ésta en automático será la clase System.Object). En C++, por ejemplo, una clase puede tener cero, una o múltiples vincuos de identidad. A esta característica se le conoce como herencia múltiple. Las razones por las que C# no implementa herencia múltiple es que ésta motivo dificultades cuando no se implementa bien (lo cual lo convierte en un asunto de un programador no muy hábil, más que una falla del lenguaje? pero bueno). Asimismo, la herencia siempre es pública (es decir, todos os métodos públicos se heredan como públicos), en contraste con C++ donde la herencia puede ser pública, protegida o privada. Por supuesto, al momento de heredar, heredamos métodos y propiedades y atributos protegidos y públicos. class ClaseBase { public void Foo() { public string Goo { get; set; class ClaseDerivada : ClaseBase { public void Hoo() { ClaseDerivada c = new ClaseDerivada(); c.Foo(); c.Goo = "Goo"; c.Hoo(); En este tenor, podemos realizar uso de la relación de la próximo forma: ClaseBase b = new ClaseDerivada(); b.Foo(); b.Goo = "Goo"; b.Hoo(); // no compila Dado que ClaseDerivada es un tipo de ClaseBase, podemos asignar a una variable de tipo ClaseBase una instancia de ClaseDerivada. Podemos invocar al método Foo y a la propiedad Goo, ya que que ClaseBase las define. No podemos, sin embargo, invocar al método Hoo porque esa es particular de ClaseDerivada. La herencia de clase puede seguir y seguir y seguir: class SegundaClaseDerivada : ClaseDerivada { ? class TerceraClaseDerivada : SegundaClaseDerivada { ? class CuartaClaseDerivada : TerceraClaseDerivada { ? Conforme vamos formando especializaciones, manifestamos que vamos formando una jerarquía de clases. Por supuesto, no importa qué tan profunda sea la jerarquía, la relación siempre se mantiene: ClaseBase b = new CuartaClaseDerivada(); b.Foo(); // ok b.Goo = "Goo"; // ok A veces querremos que una clase ya no pueda seguir heredándose. En estos casos, manifestamos que la clase es final, o que está sellada. Para sellar una clase, usamos la palabra reservada "sealed" en C#. Cualquier intento por heredar de una clase sellada, generará un yerro de compilación. sealed class QuintaClaseDerivada : CuartaClaseDerivada { ? class SextaClaseDerivada : QuintaClaseDerivada { ? // yerro de compilación Hay ocasiones en las que deseamos crear clases que sólo sirvan como base. Es decir, que puedan ser heredadas, pero no instanciadas. A estas clases las llamamos abstractas, y se marcan con la palabra reservada "abstract". abstract class ClaseBase { ? class ClaseDerivada : ClaseBase { ? ClaseDerivada d1 = new ClaseDerivada(); // ok ClaseBase b1 = new ClaseDerivada(); // ok ClaseBase b2 = new ClaseBase(); // yerro de compilación Comportamientos y contratos Como decíamos arriba, una clase abstrae comportamientos y atributos. Esto, traducido a C#, no es otra cosa que métodos y propiedades. Un conjunto de métodos determina un comportamiento: esto es, de qué manera se modifica el estado de un objeto. Ahora bien, ¿qué pasa cuando deseamos abstraer varios comportamientos? Os comportamientos en común determinan cómo se interactúa y maneja el estado de un objeto. Pongamos un ejemplo para comprender la pregunta anterior. class Point { public int X { get; set; public int Y { get; set; public static readonly Zero; public Point(int x, int y) { X = x; Y = y; static Point() { Zero = new Point(0, 0); class Line { public Point Start { get; set; public Point End { get; set; public Line(Point start, Point end) { Start = start; End = end; class Circle { public Point Center { get; set; public int Radius { get; set; public Circle(Point center, int radius) { Center = center; Radios = radios; Bien, poseemos unas tres clases que representan objetos en un plano euclídeo: un punto, una línea y un círculo. Dado que son figuras, podríamos pensar que tiene lugar una clase base, llamada Shape, y que ésta puede agrupar comportamientos comunes. Pongamos por ejemplo que deseamos tener un mecanismo para comparar dos objetos y saber si son iguales. Podemos crear un método, llamado IsEqualTo, que tome como parámetro un Shape y regrese true cuando son iguales y false en caso contrario. class Shape { public abstract bool IsEqualTo(Shape other); class Point : Shape { ? public override bool IsEqualTo(Shape other) { bool equals = false; Point pt = other as Point; if (pt != null) { equals = X == pt.X && Y == pt.Y; return equals; class Line { ? public override bool IsEqualTo(Shape other) { bool equals = false; Line ln = other as Line; if (ln != null) { equals = Start.IsEqualTo(ln.Start) && End.IsEqualTo(ln.End); return equals; class Circle { ? public override bool IsEqualTo(Shape other) { bool equals = false; Circle cc = other as Circle; if (cc != null) { equals = Center.IsEqualTo(cc.Center) && Radius == cc.Radius; return equals; De esta forma, a través e la jerarquía de clases, hemos asegurado un comportamiento: todas las figuras que hereden de Shape pueden ser comparables entre sí. Gracias a esto, podemos implementar algoritmos genéricos para la clase Shape, como por ejemplo, un método que busque en os fundamentos de un Array o List de objetos Shape, y que pueda utilizarse para cualquiera de las tres clases. static class Search { public static bool Exists(ListShape> shapes, Shape shapeToFind) { foreach (Shape shape in shapes) { if (shape.IsEqualTo(shapeToFind)) return true; return false; ? ListShape> shapes = new ListShape>(); shapes.Add(new Point(10, 15)); shapes.Add(new Line(new Point(42, 42), new Point(25, -14))); shapes.Add(new Circle(new Point(17, 15), 12)); shapes.Add(new Point(42, 42)); bool exists = Search.Exists(new Point(42, 42)); Console.WriteLine("Punto 42, 42 encontrado: {0", exists); Sin embargo, esto no es suficiente. Resulta que yo tengo, aparte, una clase Color, que faculta establecer el color de una figura (Shape). class Color { public R { get; set; public { get; set; public B { get; set; Evidentemente un Color no es una figura, por lo que no podemos establecer una relación de identidad (y por tanto no podemos heredar de Shape: realizarlo sería un yerro de diseño). Pero a todas luces, un color también puede ser comparable entre sí: class Color { public R { get; set; public { get; set; public B { get; set; public bool IsEqualTo(Color c) { bool equals = false; if (c != null) equals = R == c.R && == c. && B == c.B; return equals; Con esto vemos algo esencial: a pesar de las diferencias existentes entre Shape (y sus derivadas) y Color, ambas determinan un mismo comportamiento: ambas pueden compararse. Volviendo a mi método de búsqueda? como éste se hizo para Shape, ya nos amolamos. Podríamos realizar que Color herede de Shape, pero no tiene sentido, porque no hay realmente una relación de identidad. Podríamos cambiar al método Exists para que tome un object, y realizar la conversión correspondiente entre Shape, y si falla, despues a Color? el asunto de este enfoque es que si poseemos una tercera clase base: Pencil, que también sea comparable, pues ahora tendremos que triplicar el código de Exists. Y de todas maneras no sería nada extensible. Otro enfoque para solucionar el asunto sería crear una clase base, Comparable, de las cuales hereden tanto Color como Shape. class Comparable { public abstract bool IsEqualTo(Comparable c); class Shape : Comparable { ? class Color : Comparable { ? Esto podría resolver el asunto momentáneo. Pero? supongamos que aparte del comportamiento de comparabilidad, deseamos agregar cualquier otro comportamiento, que no lo compartan Shape y Color, pero sí Color y Pen? Vuestra jerarquía de clases se convertiría en una sumamente compleja, difícil de gestionar, y en resumen terminaríamos duplicando código y con un mal diseño entre manos. Y encima, sólo podemos tener una clase base, pues la herencia múltiple no está soportada en .NET. ¿Cómo podemos hacerle entonces para definir comportamientos que trasciendan las vinculos de identidad? La respuesta es: mediante contratos. Un contrato básicamente es la promesa de un comportamiento. Cuando uno hace un contrato comercial: quedamos en venderle a la compañía fulana una porción equis de refrescos. Pues bien, hacemos un contrato: ahí se estipula que nosotros entregaremos 200 cajas de refresco, cada caja con 10 refrescos cada una, entregables el siguiente lunes. Asimismo, establecemos que el cliente nos pagará $10 pesos por refresco, totalizando $20,000, pagaderos contra entrega. Al firmar ambas fracciónes el contrato, garantizamos que vamos a realizar lo ahí estipulado. ¿Cómo lo hagamos? No importa: yo puedo llevar mis refrescos cargando, puedo emplear a determinado camión repartidor, etc., entretanto que el cliente puede pagarme en efectivo, con cheque, con tarjeta de crédito, etc. El chiste es que se cumpla lo establecido en el contrato. Pues bien, cuando hablamos de contratos relacionados con clasificaciones, estamos queriendo decir lo mismo: garantizamos que el contrato va a realizar lo que quedamos. De cierta manera, os comportamientos de una clase constituyen un contrato en sí mismo. En efecto, garantizan un comportamiento gracias a la relación de identidad existente. Pero estos contratos no trascienden felicidad relación. Os contratos, en general, siempre trascenderán las vinculos de identidad, y facultan que clases que se adhieran a un contrato particular garantizan el comportamiento, sin importar cómo lo implemente de manera interna. En C# y .NET os contratos se determinan mediante las interfaces. Interfaces en C# y .NET Una interfaz es un contrato, el cual determina un conjunto de métodos, propiedades y eventos. Una interfaz no determina atributos y os métodos y propiedades son unicamente declarativos, no determinan un cuerpo en particular; asimismo, tampoco pueden tener modificadores de acceso. Sencillamente tipo de dato de retorno y parámetros. Las interfaces se declaran mediante la palabra reservada "interface" en C#. La próximo interfaz presenta cómo declarar una interfaz con un método, una propiedad y un evento. Nota que el nombre de la interfaz inicia con una letra I. Esto es una convención de codificación impuesto por el .NET Framework, pero está tan desarrollado que nosotros seguiremos esa convención. interface IAlgunaInterfaz { void Foo(); string Goo { get; set; event EventHandler Hoo; Cuando una clase se adhiere al contrato de una interfaz, se dice que la implementa. La implementación de una interfaz se hace parecida al de la herencia de una clase, con la salvedad que las interfaces siempre van después de la clase heredada (si existiese; separadas por comas). Además, puede implementarse más de una interfaz en una clase alguna (en cuyo caso se separan por una coma). Por otro lado, al implementar una interfaz, la clase en cuestión tiene que definir TODOS os fundamentos declarados por la interfaz, o si no recibirá un yerro de compilación. interface IComparable { bool IsEqualTo(object obj); class Shape : IComparable { public abstract bool IsEqualTo(object other); class Color : IComparable { public bool IsEqualTo(object other) { ? Y entonces ahora sí, vuestro algoritmo de búsqueda podría quedar así: static class Search { public static bool Exists(ListIComparable> objects, object objToFind) { foreach (IComparable obj in objects) { if (obj.IsEqualTo(objToFind)) return true; return false; ? ListIComparable> objs = new ListIComparable>(); objs.Add(new Point(10, 15)); objs.Add(new Line(new Point(42, 42), new Point(25, -14))); objs.Add(new Color(255, 0, 255)); objs.Add(new Circle(new Point(17, 15), 12)); objs.Add(new Point(42, 42)); objs.Add(new Color(128, 99, 128)); bool exists = Search.Exists(new Point(42, 42)); Console.WriteLine("Punto 42, 42 encontrado: {0", exists); exists = Search.Exists(new Color(128, 99, 128)); Console.WriteLine("Color [128, 99, 128] encontrado: {0", exists); Por supuesto, siempre podremos referenciar una instancia de una clase por la interfaz que implementa: IComparable c = new Point(0, 0); Pero jamás podremos instanciar una interfaz directamente: IComparable c = new IComparable(); // yerro de compilación Ahora bien, hasta este momento hemos visto cómo una interfaz se implementa en una clase con métodos particulares. Pero ¿qué pasa cuando una clase implementa dos interfaces que tienen un mismo nombre? Digo, se supone que os nombres deben ser representativos, pero pues puede ser que dos nombres sean semánticamente distintos y queramos realizar la diferencia. Este es el caso. interface IShape { void Draw(); interface IControl { void Draw(); class Circle : IShape { public void Draw() { ? class Button : IControl { public void Draw() { ? class CircledButton : IControl, IShape { Circle circle; Button button; public void Draw() { ??? En el ejemplo previo hemos creado una interfaz para definir el funcionamiento de una figura, y el de un control. Definimos un círculo que implementa IShape, y un Button que implementa IControl. Por supuesto, ahora deseamos crear un botón circular, por tanto implementamos IControl e IShape. Sin embargo, al implementar Draw: ¿qué versión ha de llamar, la de Circle o la de Button? Debería llamar una u otra, dependiendo de si quien manda llamar está pensando en un IControl o un IShape? Esto es probable mediante la implementación explícita de una interfaz. Para realizar la implementación explícita, en contraposición de la implícita que ya hemos visto, lo que hacemos es en el método, propiedad o evento, ubicar el nombre de la interfaz, seguida de un punto, seguida de? bueno, mejor un ejemplo: class CircledButton : IControl, IShape { Circle circle; Button button; void IControl.Draw() { button.Draw(); void IShape.Draw() { circle.Draw(); Como puedes ver, no hay modificadores. Esto es porque un método/propiedad/evento implementado explícitamente NO PUEDE ser invocado desde la clase, sino que tiene que ser invocado desde la interfaz. CircledButton cb = new CircledButton(); cb.Draw(); // no compila IControl b = cb; b.Draw(); // ok, se invoca a IControl.Draw IShape c = cb; c.Draw(); // ok, se invoca a IShape.Draw Por supuesto, si no nos importa y no deseamos diferenciarla, podemos abandonar la implementación implícita. class CircledButton : IControl, IShape { Circle circle; Button button; void Draw() { circle.Draw(); button.Draw(); Interfaces genéricas También cabe la pena recordad que las interfaces pueden ser genéricas, aplicando las mismas normas que para las clases. interface IComparableT> { bool IsEqualTo(T other); class Shape : IComparableShape> { public bool IsEqualTo(Shape other) { ? ... class Color : IComparableColor> { public bool IsEqualTo(Color other) { ? ... Ahora bien, las interfaces genéricas son sujetas a un concepto significativo de herencia que en .NET se implementó hasta la versión 4.0: la covarianza y contravarianza. Verdaderamente esta acceso no entrará a fondo en ambos temas, dado que es uno extenso. Sin embargo, echémosle un vistazo. Cuando en determinado fundamento genérico definimos un parámetro genérico T, este puede aceptar tres tipos de parámetros cuando se instancia: 1.- El tipo de dato T tal cual. Esto es lo que hacemos desde .NET 1.0. 2.- Se convierte entre T y tipos más especializados (i.e. clases derivadas). 3.- Se convierte entre T y tipos más globales (i.e. clases base). Pues bien, al punto 2 se le llama covarianza, y al punto 3, contravarianza. Para declarar un parámetro genérico como covariante, se le agrega la palabra reservada out. Para declararlo como contravariante, se le agrega la palabra reservada in. class ClaseT> { ? // ni uno ni otro class ClaseCVin T> { ? // contravariante class ClaseCOout T> { ? // covariante // ejemplo de covarianza ListClaseCOobject>> co = new ListClaseCOobject>>(); co.Add(new ClaseCOobject>()); // ok co.Add(new ClaseCOstring>()); // ok, porque ClaseCO es covariante y string // deriva de object. ListClaseCOstring>> co = new ListClaseCOstring>>(); co.Add(new ClaseCOstring>()); // ok co.Add(new ClaseCOobject>()); // error, porque ClaseCO es covariante y object // no derivda de string // ejemplo de contravarianza ListClaseCVobject>> cv = new ListClaseCVobject>>(); cv.Add(new ClaseCVobject>()); // ok cv.Add(new ClaseCVstring>()); // error, porque ClaseCV es contravariante y // string es más especializada que object ListClaseCVstring>> cv = new ListClaseCVstring>>(); cv.Add(new ClaseCVstring>()); // ok cv.Add(new ClaseCVobject>()); // ok, porque ClaseCV es contravariante y object // es más genérica que string Más sobre covarianza y contravarianza en este enlace Bueno, pues las interfaces pueden declararse como covariantes o contravariantes de la misma forma. De hecho esto puede ayudarnos con vuestro algoritmo de búsqueda. Lo que necesitamos aquí es declarar al parámetro de vuestra interfaz como covariante. interface IComparableout T> { bool IsEqualTo(T other); class Shape : IComparableShape> { public bool IsEqualTo(Shape other) { ? ... class Color : IComparableColor> { public bool IsEqualTo(Color other) { ? ... static class Search { public static bool Exists(ListIComparableobject>> objects, object objToFind) { foreach (IComparableobject> obj in objects) { if (obj.IsEqualTo(objToFind)) return true; return false; ? ListIComparableobject>> objs = new ListIComparableobject>>(); objs.Add(new Point(10, 15)); // a pesar de que implementa IComparableShape> objs.Add(new Line(new Point(42, 42), new Point(25, -14))); objs.Add(new Color(255, 0, 255)); // a pesar de que implementa IComparableColor> objs.Add(new Circle(new Point(17, 15), 12)); objs.Add(new Point(42, 42)); objs.Add(new Color(128, 99, 128)); bool exists = Search.Exists(new Point(42, 42)); Console.WriteLine("Punto 42, 42 encontrado: {0", exists); exists = Search.Exists(new Color(128, 99, 128)); Console.WriteLine("Color [128, 99, 128] encontrado: {0", exists); Las interfaces de .NET Ya que hemos platicado de interfaces, como último tema, me gustaría exponer determinadas de las interfaces que ya tiene .NET. ¡En efecto! Hay muchas que son muy utilizadas a lo largo de la plataforma, por lo que es significativo conocerlas. La primera sobre la que quiero hablar es la interfaz IDisposable. Esta interfaz representa un objeto que tiene recursos que han de ser liberados en manera determinista, y que no puede esperar a que el colector de basura os libere. Esta interfaz tiene un solo método, llamado Dispose. En este método debe liberarse os recursos asociados. Supongamos que poseemos una clase, llamada DataLayer, que contiene un fundamento SqlConnection, que representa una conexión a una fundamento de datos de SQL Server. Naturalmente deseamos que cuando ya no se ocupe DataLayer, se libere la conexión a la DB. Entonces implementamos IDisposable. class DataLayer : IDisposable { SqlConnection _cnn; ? void Dispose() { if (_cnn != null) { _cnn.Dispose(); _cnn = null; DataLayer d1 = new DataLayer(); ? // usamos el objeto d1.Dispose(); // liberamos recursos DataLayer d2 = null; try { d2 = new DataLayer(); ? // usamos el objeto catch { ? finally { if (d2 != null) d2.Dispose(); using (DataLayer d3 = new DataLayer()) { ? // usamos el objeto // no necesitamos llamar a Dispose DataLayer d4 = new DataLayer(); using (d4) { ? // usamos el objeto // no necesitamos llamar a Dispose Hemos ya que cuatro ejempos. El primero presenta cómo invocar Dispose de manera directa, y el segundo, dentro de un bloque try-catch-finally. Os próximos dos son especiales, pues emplean la palabra reservada using. Esta palabra acepta (dentro de os paréntesis) un objeto que debe implementar IDisposable. Si no implementa IDisposable, la sentencia motivo un yerro de compilación. La sentencia se encarga de llamar a Dispose cuando se consigue la llave de cierre del bloque. Si surgiese una excepción, el bloque using se encarga de llamar a Dispose antes de arrojar la excepción, parecida al bloque try-catch-finally. Por tanto, no es indispensable llamar a Dispose manualmente. Por cierto, la llamada a Dispose jamás debería arrojar una excepción. Vamos con la próximo interfaz. En os ejempos que mostramos hace rato, creábamos una interfaz llamada IComparable. Pues bien, esta interfaz ya tiene lugar y tiene el mismo nombre: IComparable. Esta interfaz tiene un método: CompareTo. Este método debe volver -1 cuando el objeto actual sea semánticamente menor que el objeto a comparar, 0 si son iguales, y 1 si el otro es gran. En el caso de variables numéricas, es claro. Pero por ejemplo, una cadena de texto implementa el gran y menor respecto al orden alfabético de sus letras. class Point : IComparable { public int X { get; set; public int Y { get; set; public int CompareTo(object other) { Point pt = other as Point; if (pt == null) throw new ArgumentException("other no es un Point"); int val; if (X pt.X) val = -1; else if (X > pt.X) val = 1; else if (Y pt.Y) val = -1; else if (Y > pt.Y) val = 1; else val = 0; return val; La interfaz IComparable se emplea mucho en algoritmos para ordenar colecciones de datos. Por tanto, es significativo implementarla en vuestros tipos básicos. Otra interfaz significativo es muy parecida a vuestra buena IComparable. Se llama: IEquatableT>. Esta interfaz tiene un método, Equals(T t), que indica si la instancia actual es idéntico a cierta otra insatncia. En otras palabras, que Equals regrese true equivaldría a que CompareTo regresara 0. class Point : IEquatablePoint> { public int X { get; set; public int Y { get; set; public bool Equals(Point other) { bool equals = false; if (other != null) { equals = X == other.X && Y == other.Y; return equals; Una interfaz clásica también lo es ICloneable. Esta interfaz determina un método, Clone, cuya finalidad consiste en crear una copia idéntica del objeto actual. class Point : ICloneable { public int X { get; set; public int Y { get; set; public Point Clone() { return new Point { X = this.X, Y = this.Y ; object ICloneable.Clone() { return new Point { X = this.X, Y = this.Y ; Nota que aquí implementamos dos Clones, uno de ellos explícitamente. Esto, porque el explícito regresa un object. El otro, regresa un Point fuertemente tipado. Así cumplimos con la interfaz, pero la clase recibe un valor tipado (Point). La última interfaz que es súper utilizada es IEnumerable (y su variante genérica IEnumerableT>). Esta interfaz expone un enumerador. Afortunadamente, ya he hablado de ella en otra entrada, así que hasta aquí la dejamos. También hay otras interfaces interesantes, que escaso a escaso iremos explorando. Pero por el momento, creo que son las más importantes. ¡Sigue explorando! Conclusiones Esta acceso fuese larga. Comenzamos hablando de las clasificaciones del mundo, y escaso a escaso fuimos introduciendo el asunto desde el punto de vista del diseño de software. Pusimos varios ejemplos sobre cómo clasificar, y vimos el concepto de relación de identidad. Una vez dejada clara la teoría, vimos cómo se implementa la clasificación y relación de identidad en C# y .NET, y cómo podemos crear una jerarquía de clases. Posteriormente, vimos el concepto de comportamiento y contratos, y cómo se implementan en C# mediante el concepto de interfaces. Exploramos varios conceptos relacionados, como interfaces explícitas y covarianza/contrvarianza, y finalmente vimos determinadas interfaces comunes en .NET. Ha sido larguito, espero que haya valido la pena. ¡No dudes en abandonar tus preguntas!

Entradas populares