.NET es libre? hay que pagar licencias?

Ayer un amigo, con bastante preocupación, me hizo la siguiente consulta:

"Mira yo estoy en la Universidad aún tengo que sacar un proyecto. Que opción elegirías tu para desarrollar un proyecto web? Excluyendo ASP.NET, por el tema del pago de licencias."

image

Yo que andaba concentrado en NHibernate, moví la cabeza, como sacudiéndome el letargo, que me traían horas de desarrollo previo y le dije:

"Un momento, dijiste licencias por usar ASP.NET?"

A lo que Ricardo, respondió:

"Si, sucede que yo estoy laburando desde hace varios meses con .NET, vi todas sus ventajas y como tengo que hacer ese proyecto para la Universidad, le dije a mi docente si podía hacerlo usando .NET y ella me respondió que no, porque a) No es libre y b) Tendría que pagar licencias para usar"

Preambulo

Arrrgggg, dije para mis adentros: "Otro docente (en mi país) totalmente desinformado que a su vez genera desinformación y confusión entre sus estudiantes.". No es la primera vez que algún estudiante de alguna universidad (especialmente de las Universidades del Gobierno o Estatales) vienen hacia mí con dudas como esa y no los culpo. Si aquel que se supone sabe más que tu (el docente), te dice lo primero que escucho de alguna banda de resentidos o fanáticos de "otras" plataformas y que no ha tenido la voluntad ni el deseo de informarse correctamente….. ¿Qué podemos esperar de sus estudiantes?…. pues ese tipo de preguntas y aseveraciones.

image Tampoco los culpo, porque el medio en el que hoy nos desenvolvemos, es un creciente caldo de cultivo de odios, miedos y resentimientos hacia Microsoft, caldo de cultivo que es aprovechado por cuan aprendiz desinformado de geek, que suelta la primera ideota que ha escuchado o leído incompletamente por ahí, alentados sin duda "malintencionadamente" por algunos otros geeks "seniors" que ven la oportunidad de hacer crecer su reputación con cuasi-seguidores-oveja que solo repetirán lo que ellos dicen, ocultando la verdad.

 

También existe un factor casi misterioso que alienta esta desinformación en mi país y sucede que desde hace varios años, las universidades públicas se han cerrado a enseñar únicamente J2EE como plataforma de desarrollo, con el mismo conjunto de argumentos que Ricardo vino a mí: "Si desarrollas en .NET te harán pagar licencias o tienes que pagar licencias, no es gratis, te cobraran…. Etc.", cosa totalmente equivocada, como lo explicare un poco más adelante. Si me preguntan quien metio esa idea en las universidades… la verdad no se.

Como podrán percibir, este es un tema que me molesta y repito, no por los estudiantes, sino por sus docentes y las universidades y su corta y mediocre visión. Es por esta razón que por varios años consecutivos tomo cartas en el asunto, visitando las Universidades en las ciudades que me toca vivir y dando charlas o conferencias gratuitamente sobre este tema y temas técnicos.

Este articulo/post servirá a la postre, como una referencia a preguntas y dudas similares, creo que es más que suficiente preámbulo.

Respondiendo…

Volvamos a la respuesta y los argumentos esgrimidos por la docente de nuestro amigo Ricardo:

1. NO ES LIBRE?

Ella aduce que .NET no es libre, como yo conozco bien estos argumentos puede que por LIBRE este entendiendo una de las siguientes opciones o en el peor de los casos una combinación absurda de todas ellas:

a) No es Gratis.

image

Contexto

.NET no es un producto, .NET es una plataforma, .NET es la suma de varios productos, servicios e incluso mejores prácticas; desde ese punto de vista no podría ponerse a .NET un precio. Tal vez está entendiendo por .NET a VisualStudio.NET, bueno aquí hay algo de cierto en la afirmación, VS.NET en sus versiones Profesional/Ultimate no son gratis, pero existen versiones gratuitas de VS, las versiones llamadas Express, que pueden ser encontradas aquí.

Si alguien usa estas versiones puede desarrollar aplicaciones .NET sin pagar la licencia de VS, incluso puedes desarrollar productos comerciales y venderlos y no pagaras nada por el uso de estas versiones Express. Aquí también hay una duda recurrente y es lo relacionado a SQLServer, efectivamente las versiones comerciales de SQLServer son sujetas a licenciamiento, pero también se dispone de una versión Express que pueden descargarla aquí, que también es totalmente gratuita, para hacer incluso proyectos comerciales.

Respuesta

Depende del producto que estes usando, algunos productos son gratuitos y de libre distribucion, otros estan sujetos a un pago por licenciamiento.

b) No es OpenSource.

image

Contexto

Entiéndase por OpenSource la posibilidad de disponer del código fuente de un producto de software, tal cual se define aquí; si nos vamos por ese camino y analizamos algunos de los muchos posibles pensamientos que la docente, de nuestro "caso de estudio", podría estar teniendo obtenemos lo siguiente:

Respuesta

Es VisualStudio.NET OpenSource? definitivamente no!, no tenemos en nuestras manos el código fuente de VS y yo me pregunto: Realmente lo necesitamos? Para aquellos que creen que por objetivos académicos y para aprender y para saber que pasa realmente por “detrás”, la respuesta sigue siendo no. Aunque se que Microsoft ha compartido el código de Windows con gobiernos y universidades bajo un programa/licencia conocido como Shared-Source, quizá exista una iniciativa similar para el código de VS. Me sigo encontrando personas que aun quieren aprender a hacer un entorno similar a VS y siguen preguntando más allá de la respuesta anterior. Para ellos quizá les sirve saber que existe un entorno "parecido" a VS que se llama SharpDevelop, este si es un proyecto OpenSource e incluso hay un libro que relata como construyeron su entorno, que es totalmente gratuito. Además de ser algo que he leído, probado y recomendado académicamente, es una muestra más que con .NET también podemos hacer proyectos OpenSource.

Aquí también es oportuno aclarar que pueden acceder al código de la libreria de clases del Framework.NET, el cual puede ser descargado mediante VisualStudio y a demanda y puede verse como han sido construidas las clases del FX y ni que decir de las toneladas de aprendizaje que esto trae.

c) No es libre.

image

Contexto

Quizá la docente está pensando, en la libertad en el sentido estricto o al menos en el sentido tal cual Richard Stallman, la propuso en su GPL. Para los que leen esto por primera vez seguramente es sorprendente ver que OpenSource != SoftwareLibre, son dos cosas totalmente distintas y a su vez parecidas. Estas semejanzas son las que son aprovechadas malintencionadamente como dije, por algunas personas, que con el ánimo de confundir no hacen la clara distinción entre ambas. En este vínculo he colocado un resumen de una de las charlas que di hace tiempo sobre este tema.

Respuesta

VS no está sujeta a la licencia GPL, pero nuevamente lo pregunto: Realmente lo necesitamos? Quiza desde el punto de vista de un purista de la libertad si resulte importante, pero desde mi punto de vista de la productividad sigue siendo poco relevante.

Como vimos el tema de que .NET es gratis/libre/opensource no es de lo más simple de explicar y tampoco hay una respuesta inmediata a una afirmación, que no tiene mayor información. A continuación respondemos la segunda afirmación realizada por la docente.

2. HAY QUE PAGAR LICENCIAS?

Como vimos en el punto anterior, dependiendo del caso y de las herramientas que estemos seleccionando, tendremos que pagar o no licencias. Si deseamos usar VS o SQL Server en una de sus versiones Standard/Profesional/Ultimate si tendremos que pagar licencias; si deseamos usar las versiones Express, NO, no tendremos que pagar ninguna licencia.

Pero la respuesta del licenciamiento en el ámbito académico va más allá de la anterior. Microsoft ha creado un programa denominado Microsoft Campus Enrollment (yo lo conocía por Campus Agreement), que desde el 11 de Marzo será reemplazado por Microsoft Enrollment for Education Solutions. Este programa permite que las Universidades licencien el uso de su software, por un precio anual (yo diría incluso nominal por su bajo costo) de tal manera que todos sus laboratorios, docentes, administrativos y estudiantes, pueden usar los productos Microsoft (hay que ver que algunos productos están restringidos). En el caso de VS si está permitido, así como muchas de las soluciones de la plataforma .NET, por no decir todas.

image

Entonces el tema de licenciamiento, para una universidad, no es un pretexto para no usar .NET, yo creo que pasa por un tema de información que deben recibir las autoridades de la universidad y también por una cuestión de voluntad; si las autoridades conocen los beneficios que traen estos programas o similares pero no tienen la voluntad de implementarlos es otro tema, solo están perjudicando a sus propios estudiantes.

Conclusiones

En todo caso no debería existir un docente que restrinja a un estudiante, la utilización de una herramienta o plataforma, eso demuestra solamente el miedo que puede que tengan a algo que no conocen o sus limitaciones o prejuicios personales o de sus superiores.

Así que ya saben estimados amigos estudiantes, no se dejen intimidar por sus docentes o por la universidad, el conocimiento es libre y muchas de las herramientas que ofrece Microsoft también, si alguno tiene un “caso” difícil, no dude en llamarme que gentilmente acudiré en su ayuda. :D.

Explorando NHibernate 3.0 (I)

Las personas que me conocen seguramente se sorprenderán por este y los posteriores post que escribiré con relación a NHibernate, bueno todo tiene una explicación y esa para este caso podrían ser varias: Quizá la primera y más importante el “bendito” Karma que me persigue para usar NHibernate desde hace varios proyectos y no me malinterpreten no es que esté en contra de NHibernate pero la verdad es que tiene una curva de aprendizaje bastante empinada y aunque hay mucho soporte por ahí (incluso comercial) pues me mandan a la batalla con prácticamente cero de esa armadura, otra razón puede ser que me he involucrado en proyectos en los que no quieren comprar un EF Provider para Oracle y tampoco quieren esperar a la próxima liberación de este provider “gratuito” por parte de Oracle; sea cual fuese la razón aquí me tienen escribiendo sobre NHibernate.

Como todos mis post, incluso aquellos que pongo en twitter, lo hago como una guía auto-recordatoria en un 70% y por esta razón también lanzo un ligero aviso antes de continuar leyendo. En este post, aquellos que ya conocen NHibernate no encontraran algo nuevo, quizá encuentren algunos errores míos o algo malo que esté haciendo, son libres de criticar y corregirlos, por favor.

También he decidido explorar las nuevas características de NHibernate 3.0 entre ellas probablemente la más esperada es la integración de LINQ to NHibernate (que según dicen, fue reescrito desde cero) veamos:

Entidades

Tengo inicialmente las siguientes entidades, debo mencionar que quizá la relación parezca algo extraña por que debería ser una relacion many-to-many , pero la entidad StudentCourse va a convertirse “pronto” en esa tabla intermedia, por lo que permítanme la libertad de una relación one-to-many

image

Mapeo

La configuración de los archivos de mapeo inicialmente es

 

1 <?xml version="1.0" encoding="utf-8" ?> 2 <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="DemoNHibernate.Dal.Entities" namespace="DemoNHibernate.Dal.Entities"> 3 <class name="Student" table="Students"> 4 <id name="StudentId" column="StudentId"> 5 <generator class="guid" /> 6 </id> 7 <property name="StudentName" column="StudentName" /> 8 <bag name="StudentCourses" cascade="save-update"> 9 <key column="StudentId" /> 10 <one-to-many class="StudentCourse" /> 11 </bag> 12 </class> 13 </hibernate-mapping>

1 <?xml version="1.0" encoding="utf-8" ?> 2 <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="DemoNHibernate.Dal.Entities" namespace="DemoNHibernate.Dal.Entities"> 3 <class name="StudentCourse" table="StudentCourse"> 4 <id name="StudentCourseId" column="StudentCourseId"> 5 <generator class="guid" /> 6 </id> 7 <property name="RegistrationDate" column="RegistrationDate" type="DateTime" /> 8 <many-to-one name="Student" class="Student" cascade="all"> 9 <column name="StudentId" /> 10 </many-to-one> 11 </class> 12 </hibernate-mapping>

Pruebas

Como podrán ver el mapeo y las entidades no son la gran cosa, pero aquí veamos cómo se comportan algunas pruebas que quiero hacer, fundamentalmente para borrar entidades hijas a través del update del padre (quizá esté hablando en chino para algunos pero les pido paciencia, al leer el código del UpdatingChildEntities se entenderá un poco más.

Explicare algunos elementos que verán en el código:

  • RandomText, es una clase de Markov que genera aleatoriamente frases/oraciones /parrafos
  • Estoy usando algo métodos anónimos para encapsular la llamada a la inicialización del contexto y de la transacción, el método Execute.
  • Estoy usando el patron TestDataBuilder como lo explique en un anterior post.
  • El código está en un solo archivo por ahora, por simplicidad, en la versión final lo dividiré correctamente
1 namespace DemoNHibernate.Dal.Tests 2 { 3 [TestClass] 4 public class PersistenceTests 5 { 6 private RandomText generator; 7 private ISession session; 8 protected ISession Session 9 { 10 get { return session ?? (session = NHibernateHelper.OpenSession()); } 11 } 12 13 [TestInitialize] 14 public void GenerateData() 15 { 16 generator = new RandomText(); 17 18 Execute((context, tx) => 19 { 20 var st = new StudentTestDataBuilder() 21 { 22 StudentName = generator.Sentance(), 23 StudentCourses = new StudentCoursesTestBuilder().BuildList(3) 24 }.Build(); 25 26 Session.Save(st); 27 tx.Commit(); 28 }); 29 } 30 31 [TestMethod] 32 public void DeletingChildElement() 33 { 34 Execute((context, tx) => 35 { 36 var st = (from s in context.Students 37 select s).FirstOrDefault(); 38 Assert.IsNotNull(st); 39 Assert.IsNotNull(st.StudentCourses); 40 Assert.IsTrue(st.StudentCourses.Count > 0); 41 st.StudentName = "Deleted at "+ DateTime.Now; 42 st.StudentCourses.RemoveAt(0); 43 Session.Update(st); 44 tx.Commit(); 45 }); 46 } 47 48 public void Execute(Action<BaseModelContext, ITransaction> method) 49 { 50 using (var context = new BaseModelContext(Session)) 51 using (var trx = Session.BeginTransaction()) 52 { 53 method(context, trx); 54 } 55 } 56 } 57 58 public class StudentCoursesTestBuilder 59 { 60 public virtual Student Student { get; set; } 61 public virtual DateTime RegistrationDate { get; set; } 62 63 public IList<StudentCourse> BuildList(int quantity) 64 { 65 var result = new List<StudentCourse>(); 66 for (int i = 0; i < quantity; i++) 67 { 68 StudentCourse sc = new StudentCoursesTestBuilder() 69 { 70 RegistrationDate = DateTime.Now 71 }.Build(); 72 result.Add(sc); 73 } 74 return result; 75 } 76 77 public StudentCourse Build() 78 { 79 return new StudentCourse() 80 { 81 RegistrationDate = this.RegistrationDate, 82 Student = this.Student 83 }; 84 } 85 } 86 87 public class StudentTestDataBuilder 88 { 89 public virtual string StudentName { get; set; } 90 public virtual IList<StudentCourse> StudentCourses { get; set; } 91 public Student Build() 92 { 93 return new Student() 94 { 95 StudentName = this.StudentName, 96 StudentCourses = this.StudentCourses 97 }; 98 } 99 } 100 } 101

Resultados

La prueba que me trae aquí es la que se encuentra en la línea 42, donde verán que estoy eliminando un elemento de la colección de StudentCourses, mediante el RemoveAt y luego en la línea 43 hago un update de la entidad padre, esto ocasiona un comportamiento probablemente esperado por muchos de los que ya conocen NHibernate:

  1. La entidad padre se actualiza correctamente
  2. La entidad hija borrada de la colección, NO se borra físicamente de la base de datos, simplemente se coloca un valor NULL en su llave foránea, lo cual lo desvincula a su entidad padre, digamos que hace algún tipo de borrado lógico.
  3. Porque este comportamiento? Se debe a que el la definición del mapeo, en la línea 8, del primer archivo (Student.hbm.xml) se encuentra la definición del borrado en cascada, de la siguiente manera: cascade=»save-update», es decir no se ha definido ningún comportamiento especial para el borrado.
  4. Como resultado de algunas pruebas he determinado que el método LastOrDefault() no está soportado aun por Linq to NHibernate 3.0, no es el gran problema, pero aun evidencia que no hay una implementación completa de LINQ, lastima.

    image

    image

    En un siguiente post, mas sobre el comportamiento de borrado de entidades hijas, mediante el update del padre.

    Saludos

    Comidas y bebidas favoritas de un desarrollador

    Hace unos días una compañera de trabajo descubrió que no me gusta el café y su reacción fue decir “… que extraño!… un desarrollador al que no le gusta el café” y la verdad es que yo no lo consumo hace casi 20 años y bueno me entró la curiosidad de sondear en esta nuestra comunidad, los gustos que compartimos los desarrolladores, en esas largas horas de soledad entre tu código y uno mismo. Con la curiosidad del caso, aquí están las preguntas y respuestas más simples con opciones cerradas y comunes en mi país, sin ánimo de ofender o criticar ningún gusto en particular.