Thursday, December 21, 2006

El 77% del software es ilegal en Argentina

El 77% de los programas que están instalados en computadoras personales de Argentina son "piratas". La tasa supera a la media de América latina. Otro estudio, realizado por Software Legal en 2005, arrojó que de 300 pequeñas y medianas empresas de Capital y Gran Buenos Aires, el 40% emplea programas "piratas".

Sobre esta realidad, Enrique Tarditi, presidente de la Asamblea de Pequeños y Medianos Empresarios de la Región, opinó que "Habría que hacer un blanqueo. Pero para eso es necesario producir un cambio cultural: que todas las escuelas y las universidades emplearan el sistema operativo de Linux, que es libre".

"Software Legal aconseja que cada computadora tenga instalado un software oficial. Pero eso resulta imposible desde el punto de vista económico", aseguró el empresario.

* Artículo completo en Clarín.

Este artículo ha sido tomado textualmente del site www.vivalinux.com.ar

Tuesday, December 19, 2006

Oracle 10g + RAC + Virtualización

Con mi buen amigo Dario, estuvimos implementando un cluster con Oracle 10g de 2 nodos, con una arquitectura parecida a esta. Por razones de hardware, por sobre todo por el almacenamiento compartido, tuvimos que virtualizarlo todo, comprar un NAS era imposible, en el mundo VMWare es tan fácil como crear un archivo y agregar esto en el archivo de configuración. Lo hicimos en una máquina de 1 Gb de RAM (se recomienda muy seriamente 2Gb de RAM), y levantamos a ella el nodo1 y el nodo2 (ambos Windows 2003 servers).

Es más fácil implementarlo en Windows que en Linux, pero las documentaciones que ibamos encontrando por la web, siempre referían a instalaciones en Linux (Red Hat Enterprise Linux para ser más exacto), más tarde lo haremos en Linux (si Dios quiere).

Y como dice Tarry Singh (el autor del artículo que seguimos): ”la instalacion es sólo el comienzo”, porque realmente, es apasionante implementar un cluster y ver todo el funcionamiento orquestado de los nodos, la verdad, este tema me gustó muchísimo.

El trabajo fué para la cátedra de Administración de Base de Datos de la Universidad Tecnológica Nacional - Facultad Regional Resistencia, Chaco.

Nuestra guía para la instalación del Oracle 10g + RAC + VMWare fué obtenida de aquí, y también recibimos un poco de support del mismísimo Tarry (una maza el hombre!).

Pensamos liberar una guía con los problemas que tuvimos, y las cosas que por ahí muy explicitas en la guía, espero que les pueda servir a los aventureros que anden por estos caminos. Cualquier duda…avisen y lo charlamos.
Acá les dejamos los videos de la exposición:
Parte I:

Wednesday, November 29, 2006

Se viene Expolinux2006

Tenemos el agrado de informarles que la UTN Facultad Regional Resistencia será anfitriona una vez más de un evento 100% Linux, de la mano del GULFRRE (Grupo de Usuarios Linux Facultad Regional Resistencia)

Expolinux2006
Pretende acercar GNU/Linux y el mundo FLOSS (Free Libre Open Source Software) al noreste argentino. Para ello contaremos con la presencia de disertantes de todo el país, especializados en diferentes áreas y aplicaciones del sistema operativo GNU/linux tanto para la investigación y desarrollo, como su aplicación en el dominio comercial. +>>

Monday, November 20, 2006

Se borró el Grub del MBR después de instalar win?

Si instalaste un win sobre un maquina con Linux y estabas usando grub instalado en el MBR, seguro tu loader fue borrado por el amigo. Como es esto?
Supongamos que tenemos un disco particionado de la siguiente manera:
hd1 -> NTFS (donde acabamos de instalar el win)
hd2 -> Reiserfs / (nuestra partición Linux root)
hd3 -> Reiserfs /home (la partición destinada a nuestros usuarios Linux)
hd4 -> swap
Al instalar win, éste borra lo que hay en el MBR en nuestro caso el loader.
Una de las formas para recuperar nuestro grub es conseguirnos una distro live como por ej knoppix y hacer lo siguiente:
Bootear la distro y ejecutar:
#grub
#root (hd0,1)
#setup (hd0)
#quit
Listo eso es todo. Lo que hicimos, fue decirle a grub que se instale de nuevo en el MBR y que su root está en el primer disco hd0, en la partición 2 ya que grub comienza a numerarlas desde 0 (por eso por ej. /dev/hda2 de un fdisk es igual a hd0,1 en grub).

Saturday, November 11, 2006

Tip MyGeneration && Firebird embedded

Si se por esas casualidades de la vida, estás queriendo usar MyGeneration para generar una estructura desde una DB Firebird embebida, en Windows. Tenés que hacer lo siguiente:
1) Copiar la dll fbembed.dll al directorio C:\WINDOWS\system32
Si no haces lo anterior MyGeneration te va a devolver un error tipo:
"unable to load DLL fbembed"
2) Indicarle a MyGeneration en Default Settings -> Connection String:
Driver: firebird
Database=tudb.fdb;Server=localhost;ServerType=1;User=sysdba;
password=masterkey
Eso es todo. Espero que no hayas sufrido mucho para darte cuenta de esto como yo.

Categoría and Technorati tags: catDevelop

Thursday, November 02, 2006

La Novella MS

No se que tan cierto puede resultar esto y la verdad no se que pensar!, será bueno, malo? solo el tiempo lo dirá! Lo cierto es que según este artículo hoy se reunieron: el CEO Steve Ballmer de Microsoft y el CEO Ron Hovsepian de Novell y hablaron en una rueda de prensa común. Según especifica el artículo obtenido del sitio http://www.desktoplinux.com Microsoft Corp. anunciará ofrecer ayuda en las ventas para familia de SUSE Linux de Novell Inc. Además, las dos compañías trabajarán juntas en las tecnologías que harán más fácil que los usuarios fusionen SLED (SUSE Enterprise Linux Desktop) 10 y Windows XP y Vista en el mismo Desktop.
Listo fue demasiado duro escribir esto me voy a pescar...


Categoría and Technorati tags: catIT-News

IDS qué se sabe? Portsentry como NIDS

En este post vamos a ver cómo usar Porsentry (un excelente NIDS o IPS como quieran calificarlo, desarrollado por la empresa Psionic desde octubre del 2002 propiedad de Cisco), en su configuración básica, dejando a gusto del consumidor los aderezos.

Vamos a usar un 2.6.17-gentoo-r7, con iptables 1.3.5-r4 y portsentry 1.2

A lo nuestro:

~# emerge iptables

~# emerge portsentry


Ahora tenemos que configurar portsentry para ello vamos a hacer una copia del file de ejemplo

~# cp /etc/portsentry/portsentry.conf.sample /etc/portsentry/portsentry.conf

y luego lo editamos:

~# vi /etc/portsentry/portsentry.conf


En la sección Port Configurations vamos a usar la siguiente configuración de puertos TCP y UDP que queremos scannear:

# Un-comment these if you are really anal:

TCP_PORTS="1,7,9,11,15,70,79,80,109,110,111,119,138,139,143,512,

513,514,515,540,635,1080,1524,2000,2001,4000,4001,5742,6000,

6001,6667,12345,12346,20034,27665,30303,32771,32772,32773,

32774,31337,40421,40425,49724,54320"

UDP_PORTS="1,7,9,66,67,68,69,111,137,138,161,162,474,513,517,

518,635,640,641,666,700,2049,31335,27444,34555,32770,32771,

32772,32773,32774,31337,54321"

NOTA: Ojo acá los que usan Xserver por el puerto 6000.

y comentamos las demás.


En la sección Advanced Stealth Scan Detection Options decomentamos las líneas:

ADVANCED_PORTS_TCP="1024"

ADVANCED_PORTS_UDP="1024"

para decirle a portsentry, que en modo avanzado, solamente monitoree por debajo de éstos.


Además vamos a decomentar:

# Default TCP ident and NetBIOS service

ADVANCED_EXCLUDE_TCP="113,139"

# Default UDP route (RIP), NetBIOS, bootp broadcasts.

ADVANCED_EXCLUDE_UDP="520,138,137,67"

lo cual nos servirá para evitar falsos positivos si es que estamos por ej. en un entorno WIN donde NetBIOS hace uso de TCP 113 auth para autenticar y 139 netbios-ssn para gestionar la sesión. Y los puertos UDP 520 para efs y ruteo local, 138 netbios-dgm, 137 netbios-ns y 67 bootps.


En la sección Configuration Files debemos especificar una serie de variables necesarias para el buen funcionamiento:

IGNORE_FILE="/etc/portsentry/portsentry.ignore"

La variable IGNORE_FILE guarda el path de un file llamado portsentry.ignore que será el lugar donde debemos agregar los hosts o redes que NO QUEREMOS scannear. Por lo general los hosts / redes de confianza irían aquí.



HISTORY_FILE="/etc/portsentry/portsentry.history"

La variable HISTORY_FILE guarda el path de un file llamado portsentry.history donde se almacenarán todos hosts que fueron denegados desde la instalación del servicio y


BLOCKED_FILE="/etc/portsentry/portsentry.blocked"

La variable BLOCKED_FILE guarda el path de un file llamado portsentry.blocked similar a la anterior sólo que ésta guarda los hosts denegados en la sesión actual o hasta el siguiente reinicio.



En la sección Misc. Configuration Options, vamos a decomentar:

RESOLVE_HOST = "1"

lo cual permitirá realizar el giro de las solicitudes de búsqueda DNS de los host atacantes.


En la sección Ignore Options, vamos a incluir:

BLOCK_UDP="1"

BLOCK_TCP="1"

estas variables van a indicarle a portsentry que en caso de detección de un ataque, bloque los puertos TCP y UDP para el target en cuestión. Podemos elegir que hacer 0: no bloquear, 1 bloquear y 2 correr comandos externos que bien podría ser generar alguna alerta a los administradores, a través del envio de mails por ej.


La sección Dropping Routes está dedicada a limitar / restringir rutas o host a través de reglas en las tablas locales. Por ej: podríamos incluir la siguiente:

KILL_ROUTE="/sbin/route add -host $TARGET$ gw 333.444.555.666"

la cual agregaría una entrada a nuestra tabla de ruteo local, indicándole al SO que cualquier tráfico proveniente de la IP contenida en $TARGET$ (la cual sería de nuestro atacante) sea enviada a un gateway inexistente. *IMPORTANTE* sólo una de éstas reglas pueden estar activas a la vez.


Si bien lo anterior podría servirnos en ataques no muy elevados, lo que se recomiendo es usar algún tipo de firewall para añadir más seguridad. Para ello podemos agregar reglas de firewall como por ej. la siguiente:

KILL_ROUTE="/usr/local/bin/iptables -I INPUT -s $TARGET$ -j DROP"

la cual impediría el tráfico de entrada proveniente de nuestro posible atacante.

NOTA: existen varias implementaciones de firewalls soportadas en distintas plataformas, iptables es sólo un ej.


Casi finalizando, contamos con la sección TCP Wrappers de la cual vamos a decomentar la opción:

KILL_HOSTS_DENY="ALL: $TARGET$"

la cual incluirá la IP de nuestro atacante en el file /etc/hosts.deny (una medida más de seguridad) independiente del packet filter que usemos.


Por el momento no vamos a incluir nada en la sección External Command, pero si mencionaremos que es posible accionar un comando tanto antes como después la aplicación de una regla.

NOTA: No se recomienda realizar contra ataques al origen como medida de defensa, está comprobado estadísticamente que es peor que la enfermedad.


Para finalizar la sección Scan trigger value, nos servirá para decirle a portsentry con qué rapidez actuar en caso de detección de tráfico anómalo, si especificamos esta variable en 0, le estaremos diciendo al mismo que reaccione inmediatamente. Lo anterior es lo que vamos a hacer:

SCAN_TRIGGER="0"

Podríamos establecerlo en valores como 1 o 2 para dar un aviso primero y luego aplicar reglas, etc.


No soy partidario de utilizar mensajes de banneo, pero cabe aclarar que esta posibilidad está abierta si alguien lo desea en la sección Port Banner Section.


Lo que nos queda:

Verificar que nuestro iptables esté funcionando correctamente para lo cual vamos a ejecutar:

~# /etc/init.d/iptables status

* status: stopped

y si está parado como en nuestro caso vamos a iniciarlo.

~# /etc/init.d/iptables start

  • Loading iptables state and starting firewall ... [ ok ]


Antes de iniciar a portsentry vamos a editar dos files:

El primero:

~# vi /etc/conf.d/portsentry


#PORTSENTRY_MODES="udp tcp"

#PORTSENTRY_MODES="stcp sudp"

PORTSENTRY_MODES="atcp audp"

donde vamos a seleccionar el modo de scanneo del mismo.


El segundo Y NO SE OLVIDEN a menos que quieran ser vaneados uds mismos:

~# vi /etc/portsentry/portsentry.ignore

#Para evitar bannear el uso de loopback

127.0.0.1/32

#Para evitar bannear nuestro host ej.

172.16.0.178

#Podríamos incluir redes completas como el caso de

172.16.0.0/24


Ahora si a iniciar portsentry:

~# /etc/init.d/portsentry start

  • Starting portsentry ... [ ok ]


Listo ahora los logs pueden verse en el messages, ya que portsentry trabaja con syslog y es ahí donde los almacena.

Por ej podríamos verlo con:

~# tail -F /var/log/messages | grep portsentry


Por el momento eso es todo.

Categoría and Technorati tags: catNetworking

Thursday, October 26, 2006

Raman Amplification in SAN - for Disaster Recovery

Cuán lejos debe estar un Data Center primario de un secundario? Este artículo escrito por Per B. Hansen - Director, Business Development, Optical Solutions ADVA Optical Networking, nos da una pauta de cuán lejos debe estar un DC primario de un secundario y las tecnologías aplicadas en la actualidad para que dicha separación sea por ej. de 200km con velocidades de hasta 10Gbps.

Categoría and Technorati tags: catNetworking

Monday, October 23, 2006

Conectando dos ap, por ahora sin solución Pate II

Bien... Continuando con la travesía de conexión, se agregó un nuevo dispositivo también de la marca Encore al esquema propuesto, debido a no haber encontrado solución alguna a la conexión entre los 2 AP. Lo que se probó en esta ocasión es usar en uno de los extremos un AP de los que ya teníamos y en el otro extremo un LAN Extender ENRXWI-G (la nueva adquisición), luego el esquema resultante fue el siguiente:

AP (ENHWI-G) <------------------>EX (ENRXWI-G)

||-------------------------------------------------------||

DHCP Server ---------------------------------Cliente

Conf.1

Aclaraciones:

a) Las IP’s tanto del AP como del EX fueron introducidas a mano y eran del mismo rango que las del Server.

b) Se anularon las funciones DHCP del AP.

c) El SSID fue el mismo siempre para todos los dispositivos como así también lo fue el canal de transmisión.

Curiosidades:

1) Prueba: Se realizó la primer prueba, haciendo que una laptop se conecte al único puerto ethernet del EX (vía wire & wireless) y solicite una IP.

Resultado: No funcionó ni wire, ni wireless. Sin embargo las solicitudes ARP llegaban al DHCP Server del otro extremo.

2) Prueba: Se le asigno a mano una IP (estática) a la laptop conectada al EX.

Resultado: Funcionó pero no tenía sentido para la configuración DINAMICA que necesitábamos.

3) Prueba: Se hizo que el EX solicite DHCP en lugar de tener asignada una IP estática.

Resultado: Funcionó pero solamente hasta el EX llegaban los ARP (no a la laptop).

4) Prueba: Se invirtieron las posiciones de los dispositivos de la siguiente manera:


EX (ENRXWI-G) <------------------>AP (ENHWI-G)

||-------------------------------------------------------||

DHCP Server ---------------------------------Cliente

Conf.2

Resultado: Funcionó, la laptop recibió una IP vía DHCP con todas las configuraciones necesarias, gw, dns, etc. Pero no podían rutearse los paquetes hacia fuera (Internet). (Tema pendiente a investigar por qué sucede esto).

A todo esto, le hemos escrito a la gente de Encore, quienes muy amablemente nos han contestado diciendo: Sres. gracias por contactarnos y toda la historia, pero Uds. están locos jajaja (en realidad no dijeron eso): lo que quieren hacer no es viable con esos dispositivos, tema WDS y demás yerbas.

Respuesta de Encore:

Thank you for contacting Encore Electronics Technical Support. If you are trying to do this wirelessly, it is not going to work. The ENHWI-G does not support WDS. Only the ENRXWI-G does support WDS.

Wired it will work as long as you assign different IP address to each router. Make sure that only one of the routers has DHCP enabled. I World also recommend that with the three routers that have DHCP disabled. Are not connected to the network through their Wan port.


XX
Encore Electronics Technical Support
www.encore-usa.com

Conclusión:

No hay nada mejor que la estandarización y sobre todo los estándares abiertos.

Hurgando en las profundidades de Internet he encontrado una serie de sites que tal vez diluciden u obscurezcan el panorama con frases como: “The WDS feature is not completely specified in IEEE or Wifi standards”. Analizando un poco el tráfico ARP (con la Conf.1) vimos que al DHCP Server llegan las solicitudes con la MAC de la laptop y éste le enviaba una respuesta que aparentemente quedaba en el EX, quien no era capaz de redirigirla. También hay un draft en http://grouper.ieee.org/groups/802/11/ sobre WDS que tal vez pueda ayudar a estandarizar las cosas proponiendo un sistema de flags sobre el BSSID en las tramas 802.11.

Por ahora es lo que hay pero prometo seguir danto pelea…

Categoría and Technorati tags: catNetworking

Monday, October 02, 2006

Conectando dos ap, por ahora sin solución

Con un amigo estamos intentando conectar dos puntos mediante dos access point encore ENHWI-G, lo raro es que la primera vez que los conectamos logramos hacer lo que queríamos, a continuación les explico la secuencia:
1 Se encendió el primer dispositivo desde ahora llamado ap1 y se configuró de la siguiente manera:

ap1
IP=10.2.0.1
netmask=255.255.0.0
domainname=mydomain.com.ar
ssid=mynet
Eso fue lo único que se hizo en el primer dispositivo.

2 Se encendió el segundo dispositivo desde ahora llamado ap2 y se configuró de la siguiente manera:

ap2
IP=10.2.0.2
netmask=255.255.0.0
domainname=mydomain.com.ar
* el ssid=mynet pero fue tomado automáticamente por el dispositivo al arrancar.

Luego de esto, comenzamos a realizar las pruebas:
1 Se conectó al switch que trae el ap1 un DHCP server mediante un patchcord.
2 En el otro extremo en el ap2 se conecto al switch también mediante un patchcord una pc que debería tomar una dirección mediante el DHCP mencionado.
3 Así fue, la pc tenía asignada una IP del DHCP server de la clase que éste otorgaba 10.1.0.*
4 Se realizó un trazado de ruta mediante el comando tracert y vimos que todo funcionaba correctamente, los ap no aparecían en ésta, eran transparentes y sólo cumplían su función de backbone.

Problemas:
Llevamos los dispositivos a su destino final y lo único que hicimos fue cambiar el ssid... Nuuu para qué lo tocamos, desde ese momento nuestra configuración dejó de funcionar y hasta el momento sigue sin hacerlo, de eso ya hace 2 días y sigo googleando, foreando y maileando sin soluciones. Ni bien lo solucionemos lo publico, de más está decir que si alguien ya lo hizo que nos avise.

Categoría and Technorati tags: catNetworking

Monday, September 18, 2006

Búsquedas semánticas Ha! el Kia se la banca?

Según su about http://www.hakia.com/about.html Hakia es el primer buscador web basado en conocimiento. La idea es obtener respuestas y resultados significativos a las preguntas sobre cualquier tema. Para alcanzar esta meta, hakia utiliza un sistema semántico propietario en vez de un índice convencional. Ideal para búsquedas basadas en significado. (basadas en significado? Brevemente "La idea es que el usuario pueda obtener resultados de sus búsquedas no sólo por el matching de palabras sino también por su significado semántico...")
Particularmente he realizado algunas búsquedas y no veo diferencias entre búsquedas convencionales por matching, tal vez Uds. puedan lograrlo, si es así por favor avísenos.

Saludos.

Vía: http://google.dirson.com/post/2822-nuevos-buscadores-chacha-haika

Categoría and Technorati tags: catIT-News

Sunday, September 10, 2006

quE Socio te mAndaste!!!

El grupo clarin, principal de medios de Argentina y uno de los más importantes de habla hispana como se puede leer en su portal web, anunció recientemente ser el primer revendedor de productos Google AdWords en Argentina, algo que no asombraría a nadie pero pone otra vez de manifiesto el objetivo de utilizar la más avanzada tecnología para ampliar la gama de opciones informativas, culturales y de entretenimiento, así como promover y difundir el talento argentino en el contexto de un mundo globalizado.
http://www.adwords.clarin.com/

Categoría and Technorati tags: catIT-News

Saturday, September 09, 2006

IronPython lo que muchos esperaban del otro lado

Acaba de salir al sol, la version liberada de IronPython. Uno de los interpretes del lenguaje que corre integrado al framework de .NET facilitando la vida de los programadores y manteniendo su total compatibilidad con el lenguaje.
Para bajar la última version: http://www.codeplex.com/Release/ProjectReleases.aspx?ProjectName=IronPython&ReleaseId=423

Vía: http://www.vivalinux.com.ar/soft/ironpython-1.0.html

Categoría and Technorati tags: catDevelop

Friday, September 01, 2006

AI que mirar hacia dentro

Google acaba de comprar la compañía Neven Vision especialista en reconocimiento biométrico. Ya podemos observar cómo las fotografías de los contactos en gmail se limitan a los rostros a la hora de su visualización y esto es por que ellos están realizando búsquedas interiores en las imágenes pudiendo reconocer rostros, mediante el uso de AI. Con estas técnicas pueden determinar entre otras cosas el sexo de las personas de una imagen.
Sergey Brin uno de los creadores de Google cuenta que este era uno de los mayores desafíos propuestos por la compañía en sus inicios, destacando además que la idea es ver y analizar el contenido de cada imagen. Un nuevo juego de la compañía http://images.google.com/imagelabeler/ consiste en entrenar a Google para que aprenda a reconocer lo que hay en una imagen.

Fuentes:
http://www.genbeta.com/archivos/2006/08/16-google-adquiere-neven-vision-.php
http://software.gigaom.com/2006/08/15/google-buys-photo-recognition-company
http://google.dirson.com/post/2792-image-labeler-inteligencia-artificial/

Categoría and Technorati tags: catIT-News

Monday, August 28, 2006

Un emprendedor no debe cerrar su mente

Desde hace un par de años el movimiento Open Source está ganando cada vez más terreno con el apoyo de grandes empresas a nivel mundial como: IBM, ORACLE, Google, entre otras pequeñas como las anteriores, y la aceptación por parte del público en general. Si bien existen diferencias entre lo que es Open Source y Free Software (todo un tema para charlar), llamémoslas FLOSS para no irritar a nadie.

Este fenómeno sin dudas puede verse http://www.youtube.com/watch?v=xgVq4rqt-I4&search=Linux como un claro ejemplo de cambio de hábito que debemos aprovechar como entrepreneurs. El mismo se viene dando en los grandes países en mayor medida y trasladando paulatinamente a los pequeños (Económica, Educacional y Políticamente hablando) como el nuestro. No me considero un experto en el tema, pero creo que no hace falta serlo para poder ver las ventajas que el Open Source sugiere.

Para finalizar les dejo una historia de emprendimiento, la de Sergey Brin (23 años entonces) y Larry Page (24) http://google.dirson.com/google-linux.php para que vean que no es fanatismo lo que profeso al hablar de Open Source y Linux perdón llamémosle FLOSS.

Categoría and Technorati tags: catIT-News

Sucede en las mejores familias!!! Google


Google Argentina dejó de funcionar el día de hoy 27/08/06 por unos minutos. La cosas es que cualquier petición que se le realizase al famoso buscador arrojaba el siguiente resultado:
Su búsqueda - LO BUSCADO - no produjo ningún documento
Sugerencias:
  • Asegúrese de que todas las palabras estén escritas correctamente.
  • Intente usar otras palabras.
  • Intente usar palabras más generales.
Como dice un amigo: sucede en las mejores familias, lo triste es que sea la mía. Les acompaño una imagen para aquellos que no pudieron ver el fenómeno en acción. El artículo completo en http://google.dirson.com/noticias.new/2780/

Categoría and Technorati tags: catIT-News

Próximamente Developer Day

El sábado 16 de septiembre en el aula magna de la UTN-Regional Resistencia se realizará el Developer Day, una jornada de conferencias destinadas al desarrollo de software, donde se podrán observar distintas herramientas que van desde IDEs, Lenguajes, Generadores de Código, Aplicación de Patrones, y una serie de recursos destinados a hacer el trabajo mucho más fácil, agradable y robusto. Entre las alternativas propuestas se verán herramientas Open Source, Microsoft .NET, y Java J2EE.

Categoría and Technorati tags: catDevelop