Archivo para 30/05/07

Chupando WIFI del vecino

slurlpr.jpg

Conviertete en el vecino mas odiado.

Slurpr, es una cajita con alma Linux y apariencia de puercoespin que es capaz de conectarse a seis redes wifi de forma simultanea y combinar los diferentes anchos de banda de todas ellas para crear una “superconexion”. Eso si, es algo caro pero… ¿cual es el precio de la libertad?. Cuidado vecinos que os “robo” la conexion…

Noticia Original | el mundo

Mapear una carpeta compartida de Windows desde Linux

En este blog me encuentro el siguiente truco.

nota: no he podido comprobarlo pues no dispongo ahora mismo de ninguna maquina Windows. pero lo publico para aquellos que si pueda ser de utilidad.

Realmente puedes acceder a la maquina compartida com smb://nombremaquina, pero este truco te puede ser de utilidad si quieres montar la carpeta en tu sistema de ficheros. Hago una pequeña traduccion.

Se ejecuta el siguiente comando:

$ sudo smbmount -t smbfs -o username=<tu_cuenta_windows> <//path_a_carpeta_compartida> </directorio_de_montaje>

Ejemplo:

Si la carpeta compartida es //myserver/mydir (usa “/” en lugar de “\” en sistemas Linux) y el punto de montaje en linux es /mnt/windir. Si el dominio Windows es COMPANY y la cuenta en el dominio es aan. El comando seria:

smbmount -t smbfs -o username="company\aan" //myserver/mydir /mnt/windir

Pulsa <Enter> y se te pedira la password dentro del dominio COMPANY. Tras introducirla ya puedes acceder a la carpeta compartida desde /mnt/windir.

Trucos para Photoshop y Gimp

Una buena coleccion de trucos y tutoriales que puedes encontrar en villanos.net

Con licencia creative commons. Puedes descargarte el curso completo desde aqui.

Esto “si” es un atraco…

20070530elpepivin_2.jpg

Lo catalogo en Humor, pero no se, no se… y ojala fuera cierto, yo este año le he pagado al banco mas de 6000 euros solo de intereses. Ojala fueran 8000 en tres años. buahhhh….

Relacionado | El euribor de nuestros amores

Visto en | meneame

Compilar ASN.1 a C/C++

Aviso, Este es un articulo muy tecnico, completamente de programacion en C/C++. Si eres nuevo en Linux, seguramente no te interese, como siempre puedes leerlo / o no bajo tu propia responsabilidad. Si no te interesa, En este sitio se tocan muchos temas y seguramente encuentres algun otro que te pueda interesar mas.

En mi trabajo creamos aplicaciones para codificar y decodificar informacion mediante ASN.1, es una de las formas que empleamos para transmitir/recibir informacion entre host que son heterogeneos, por ejemplo para enviar informacion de un Linux a una estacion Sun Solaris, o a cualquier otra plataforma. En este pequeño articulo comento una breve introduccion a ASN.1 y como lo podemos usar en nuestras aplicaciones C/C++.

¿Que es ASN.1?

Como bien dice la wikipedia, ASN.1 (Abstract Syntax Notation One) es una notacion flexible y estandard que describe estructuras de datos para representarlas, codificarlas, transmitirlas y decodificarlas.

Veamos un ejemplo:

Podriamos tener la siguiente definicion de una estructura en ASN.1:

FooProtocol DEFINITIONS ::= BEGIN
FooQuestion ::= SEQUENCE
{
trackingNumber INTEGER,
question VisibleString
}
FooAnswer ::= SEQUENCE
{
questionNumber INTEGER,
answer BOOLEAN
}
END

Y de acuerdo a esta definicion podriamos querer transmitir la siguiente informacion:

myQuestion FooQuestion ::= {
trackingNumber 5,
question "Anybody there?"
}

Es decir, una estructura de tipo “FooQuestion” que tiene dos campos, uno llamado trackingNumber con valor igual a 5 y otro llamado question con valor “Anybody there?”

Esto realmente cuando lo codificamos no se envia como texto plano sino como una secuencia de Bytes:

30 13 02 01 05 1a 0e 41 6e 79 62 6f 64 79 20 74 68 65 72 65 3f

Que significa lo siguiente:

30 -- es un tag que indica SEQUENCE
13 -- longitud en octetos
02 -- tag que indica que lo que sigue es un INTEGER
01 -- longitud en octetos (1 byte)
05 -- valor del dato
1a -- tag que indica que lo que sigue es un VisibleString
0e -- longitud en octetos (14 bytes)
41 6e 79 62 6f 64 79 20 74 68 65 72 65 3f -- el valor ("Anybody there?" codificado en ASCII)

Realmente y basicamente es una secuencia donde 1 byte indica lo que viene a continuacion, otro byte o bytes indica el tamaño de lo que sigue y a continuacion viene el dato. Todo ello codificado como ves en una secuencia de bytes.

Cuando al receptor le llegue ese chorizo de bytes, lo sabe decodificar y rellena la estructura correspondiente.

Pues bien, nuestras aplicaciones para trabajar con este formato codificado deben implementar las funciones que se encarguen de codificar y decodificar estas estructuras. Pero para ello contamos con snacc, que nos hace la vida mas facil y nos autogenera las cabeceras .h y librerias .c necesarias sin tener que escribir el codigo.

snacc es un compilador de sintaxis ASN.1 a C/C++.

Para instalarlo en Ubuntu ejecutamos:

$ sudo apt-get install snacc

Tras instalarlo. si lo ejecutamos sin mas, nos muestra la siguiente informacion:


jose@soledad:~/Desktop/snacc4J$ snacc
Usage: snacc [-h] [-P] [-t] [-v] [-e] [-d] [-p] [-f]
[-c | -C | -[T|O] <table output file> | -idl ]
[-u <useful types ASN.1 file>]
[-mm] [-mf <max file name length>]
[-l <neg number>]
<ASN.1 file list>
-h prints this msg
-c generate C encoders and decoders (default)
-C generate C++ encoders and decoders
-novolat for broken C++ compilers: return *this after calling abort()
-T <filename> write a type table file for the ASN.1 modules to file filename
-O <filename> writes the type table file in the original (<1.3b2) format
-idl generate CORBA IDL
-u <filename> specifies the ASN.1 file with definition of the useful types
(i.e. PrintableString). See the useful.asn1 file (in the
snacc/asn1specs/ directory).
-P print the parsed ASN.1 modules to stdout from their parse trees
(helpful debugging)
-t generate type definitions
-v generate value definitions (limited)
-e generate encode routines
-d generate decode routines
-p generate print routines
-f generate hierarchical free routines (C only)
note: if none of -t -v -e -d -p -f are given, all are generated.
These do not affect type tables.
-mm mangle output file name into module name (by default, the output file
inherits the input file's name, with only the suffix replaced)
-mf <num> num is maximum file name length for the generated source files
-l <neg num> where to start error longjmp values decending from (obscure).
Use `-' as the ASN.1 source file name to parse stdin.
This ASN.1 compiler produces C or C++ BER encoders and decoders or type tables.
Version 1.3, 1997-10-20.
Please see snacc@cs.ubc.ca for new versions and where to send bug reports and comments.
Copyright (C) 1993 Michael Sample and UBC
Copyright (C) 1994, 1995 by Robert Joop and GMD FOKUS
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
jose@soledad:~/Desktop/snacc4J$

Ahora bien, vamos a escribir un fichero de definicion ASN.1 como ejemplo y ver como generar la cabecera y fichero con el cuerpo que luego emplearemos en nuestros propios programas.

Por ejemplo escribi el siguiente fichero y llamalo “Persona.ASN1”


Ejemplo DEFINITIONS ::= BEGIN
Persona ::= SEQUENCE {
nombre [0] PrintableString (SIZE(1..30)),
edad [1] INTEGER,
sexo [2] Sexo OPTIONAL
}
Sexo ::= ENUMERATED {
desconocido (0),
masculino (1),
femenino (2)
}
END

Para compilarlo ejecutamos:

$ snacc -u /usr/include/snacc/asn1/asn-useful.asn1 Persona.ASN1

y automaticamente nos genera 2 ficheros:

/*
* Persona.h
*
* "Ejemplo" ASN.1 module C type definitions and prototypes
*
* This .h file was generated by snacc on Wed May 30 13:03:29 2007
*
* UBC snacc written compiler by Mike Sample
*
* NOTE: This is a machine generated file--editing not recommended
*/
#ifndef _Persona_h_
#define _Persona_h_
typedef enum
{
DESCONOCIDO = 0,
MASCULINO = 1,
FEMENINO = 2
} Sexo; /* ENUMERATED { DESCONOCIDO (0), MASCULINO (1), FEMENINO (2) } */
#define BEncSexoContent BEncAsnEnumContent
#define BDecSexoContent BDecAsnEnumContent
#define PrintSexo PrintAsnEnum
#define FreeSexo FreeAsnEnum
typedef struct Persona /* SEQUENCE */
{
PrintableString nombre; /* [0] PrintableString (SIZE (1..30)) */
AsnInt edad; /* [1] INTEGER */
Sexo* sexo; /* [2] Sexo OPTIONAL */
} Persona;
AsnLen BEncPersonaContent PROTO ((BUF_TYPE b, Persona *v));
void BDecPersonaContent PROTO ((BUF_TYPE b, AsnTag tagId0, AsnLen elmtLen0, Persona *v, AsnLen *bytesDecoded, ENV_TYPE env));
void PrintPersona PROTO ((FILE* f, Persona *v, unsigned short int indent));
void FreePersona PROTO ((Persona *v));
#endif /* conditional include of Persona.h */

y

/*
* Persona.c
*
* "Ejemplo" ASN.1 module encode/decode/print/free C src.
*
* This file was generated by snacc on Wed May 30 13:03:29 2007
*
* UBC snacc written by Mike Sample
*
* NOTE: This is a machine generated file - editing not recommended
*/
#include "asn-incl.h"
#include "Persona.h"
AsnLen
BEncPersonaContent PARAMS ((b, v),
BUF_TYPE b _AND_
Persona *v)
{
AsnLen totalLen = 0;
AsnLen itemLen;
AsnLen listLen;
void *component;
if (NOT_NULL ((v->sexo)))
{
BEncEocIfNec (b);
itemLen = BEncSexoContent (b, (v->sexo));
BEncDefLenTo127 (b, itemLen);
itemLen++;
itemLen += BEncTag1 (b, UNIV, PRIM, 10);
itemLen += BEncConsLen (b, itemLen);
itemLen += BEncTag1 (b, CNTX, CONS, 2);
totalLen += itemLen;
}
BEncEocIfNec (b);
itemLen = BEncAsnIntContent (b, (&v->edad));
BEncDefLenTo127 (b, itemLen);
itemLen++;
itemLen += BEncTag1 (b, UNIV, PRIM, 2);
itemLen += BEncConsLen (b, itemLen);
itemLen += BEncTag1 (b, CNTX, CONS, 1);
totalLen += itemLen;
BEncEocIfNec (b);
itemLen = BEncPrintableStringContent (b, (&v->nombre));
itemLen += BEncDefLen (b, itemLen);
itemLen += BEncTag1 (b, UNIV, PRIM, 19);
itemLen += BEncConsLen (b, itemLen);
itemLen += BEncTag1 (b, CNTX, CONS, 0);
totalLen += itemLen;
return totalLen;
} /* BEncPersonaContent */
void
BDecPersonaContent PARAMS ((b, tagId0, elmtLen0, v, bytesDecoded, env),
BUF_TYPE b _AND_
AsnTag tagId0 _AND_
AsnLen elmtLen0 _AND_
Persona *v _AND_
AsnLen *bytesDecoded _AND_
ENV_TYPE env)
{
int seqDone = FALSE;
AsnLen totalElmtsLen1 = 0;
AsnLen elmtLen1;
AsnTag tagId1;
int mandatoryElmtCount1 = 0;
AsnLen totalElmtsLen2 = 0;
AsnLen elmtLen2;
AsnTag tagId2;
tagId1 = BDecTag (b, &totalElmtsLen1, env);
if (((tagId1 == MAKE_TAG_ID (CNTX, CONS, 0))))
{
elmtLen1 = BDecLen (b, &totalElmtsLen1, env);
tagId2 = BDecTag (b, &totalElmtsLen1, env);
if ((tagId2 != MAKE_TAG_ID (UNIV, PRIM, PRINTABLESTRING_TAG_CODE)) &&
(tagId2 != MAKE_TAG_ID (UNIV, CONS, PRINTABLESTRING_TAG_CODE)))
{
Asn1Error ("Unexpected Tag\n");
longjmp (env, -100);
}
elmtLen2 = BDecLen (b, &totalElmtsLen1, env);
BDecPrintableStringContent (b, tagId2, elmtLen2, (&v->nombre), &totalElmtsLen1, env);
if (elmtLen1 == INDEFINITE_LEN)
BDecEoc (b, &totalElmtsLen1, env);
tagId1 = BDecTag (b, &totalElmtsLen1, env);
}
else
longjmp (env, -101);
if (((tagId1 == MAKE_TAG_ID (CNTX, CONS, 1))))
{
elmtLen1 = BDecLen (b, &totalElmtsLen1, env);
tagId2 = BDecTag (b, &totalElmtsLen1, env);
if (tagId2 != MAKE_TAG_ID (UNIV, PRIM, INTEGER_TAG_CODE))
{
Asn1Error ("Unexpected Tag\n");
longjmp (env, -102);
}
elmtLen2 = BDecLen (b, &totalElmtsLen1, env);
BDecAsnIntContent (b, tagId2, elmtLen2, (&v->edad), &totalElmtsLen1, env);
if (elmtLen1 == INDEFINITE_LEN)
BDecEoc (b, &totalElmtsLen1, env);
if ((elmtLen0 != INDEFINITE_LEN) && (totalElmtsLen1 == elmtLen0))
seqDone = TRUE;
else
{
tagId1 = BDecTag (b, &totalElmtsLen1, env);
if ((elmtLen0 == INDEFINITE_LEN) && (tagId1 == EOC_TAG_ID))
{
BDEC_2ND_EOC_OCTET (b, &totalElmtsLen1, env)
seqDone = TRUE;
}
}
}
else
longjmp (env, -103);
if ((!seqDone) && ((tagId1 == MAKE_TAG_ID (CNTX, CONS, 2))))
{
elmtLen1 = BDecLen (b, &totalElmtsLen1, env);
tagId2 = BDecTag (b, &totalElmtsLen1, env);
if (tagId2 != MAKE_TAG_ID (UNIV, PRIM, ENUM_TAG_CODE))
{
Asn1Error ("Unexpected Tag\n");
longjmp (env, -104);
}
elmtLen2 = BDecLen (b, &totalElmtsLen1, env);
(v->sexo) = (Sexo*) Asn1Alloc (sizeof (Sexo));
CheckAsn1Alloc ((v->sexo), env);
BDecSexoContent (b, tagId2, elmtLen2, (v->sexo), &totalElmtsLen1, env);
if (elmtLen1 == INDEFINITE_LEN)
BDecEoc (b, &totalElmtsLen1, env);
seqDone = TRUE;
if (elmtLen0 == INDEFINITE_LEN)
BDecEoc (b, &totalElmtsLen1, env);
else if (totalElmtsLen1 != elmtLen0)
longjmp (env, -105);
}
if (!seqDone)
longjmp (env, -106);
(*bytesDecoded) += totalElmtsLen1;
} /* BDecPersonaContent */
void
PrintPersona PARAMS ((f, v, indent),
FILE* f _AND_
Persona *v _AND_
unsigned short int indent)
{
if (v == NULL)
return;
fprintf (f,"{ -- SEQUENCE --\n");
Indent (f, indent + stdIndentG);
fprintf (f,"nombre ");
PrintPrintableString (f, (&v->nombre), indent + stdIndentG);
fprintf (f, ",\n");
Indent (f, indent + stdIndentG);
fprintf (f,"edad ");
PrintAsnInt (f, (&v->edad), indent + stdIndentG);
if (NOT_NULL ((v->sexo)))
{
fprintf (f,",\n");
Indent (f, indent + stdIndentG);
fprintf (f,"sexo ");
PrintSexo (f, (v->sexo), indent + stdIndentG);
}
fprintf (f,"\n");
Indent (f, indent);
fprintf (f,"}");
} /* PrintPersona */
void
FreePersona PARAMS ((v),
Persona *v)
{
if (v == NULL)
return;
FreePrintableString ((&v->nombre));
FreeAsnInt ((&v->edad));
if (NOT_NULL ((v->sexo)))
{
FreeSexo ((v->sexo));
Asn1Free ((v->sexo));
}
} /* FreePersona */

Que ya podremos emplear en nuestros programas para implementar las rutinas de codificacion y decodificacion.

El ejemplo para el fichero ASN.1 lo he sacado de la siguiente direccion.

Crea botones para tu web

ubuntulife.png

Si necesitas crear botones de una manera sencilla para tu web o blog, te recomiendo que visites este sitio: mycoolbutton
Posee un asistente muy sencillo donde especificas el tamaño, color, texto e incluso icono personalizado que puedes añadir y tras completar el proceso te da la opcion de descargarte la imagen a tu escritorio. Genial.

Star wars – The clone wars

3dclonewars.jpg

Coincidiendo con el 30 aniversario, se ha presentado la que va a ser la nueva serie de animacion basada en Starwars, que lleva por titulo The clone wars. Existia una serie realizada con animacion tradicional pero a diferencia de ella, esta nueva serie esta realizada integramente con ordenador. Yo he visto el video y sencillamente solo puedo decir: “Impresionante”. Espero que pronto comiencen la emision para ser uno de sus seguidores.

Os dejo aca los videos. He tenido problemas con el video en formato FLV pues creo que no tengo instalado el codec en mi Ubuntu, pero el video en formato mov si lo he podido visualizar correctamente.

Pagina oficial
video FLV (5Mb)
video MOV (27 Mb)

Visto en | Skol news

Experto de Microsoft recomienda usar Linux

No deja de ser curiosa esta noticia, aunque desde mi punto de vista es la opinion de una persona no de una organizacion, pero es reconfortante saber que en estas ocasiones incluso se tiene en cuenta este software que tan malo parece ser (modo ironia).

Michael Francisco, director de productos de Microsoft vinculado a Open Source Software Lab, sugiere a los usuarios de Windows probar Linux.

En su blog, Francisco escribe: “me ha ocurrido y estoy seguro que le ha ocurrido usted también. El programa no arranca y sus datos quedaron atrapados al interior de su PC. El problema puede ser de hardware o de software, y aparentemente es irrecuperable. En este contexto, Linux puede a menudo ser usado como herramienta para recuperar datos que de otra forma se perderían”. Luego, Francisco presenta un documento en que aparece descrita la forma en que Linux puede emplearse para recuperar datos de una computadora con Windows fuera de servicio.

Asi que digo yo por lo menos los usuarios Windows pueden usar Linux cuando se estropea su sistema operativo para poder recuperar sus datos (fin modo ironia)

Bromas aparte, el documento puede ser de interes para aquellas personas que se encuentren en una situacion parecida. Siempre es bueno conocer cualquier alternativa en el caso de que tengamos que recuperar nuestros datos.

Enlace al documento | Recuperacion de datos de Sistemas Windows usando Linux

Visto en | Viva Linux

Prohibido Pensar – Territorio Patentado

mente1.jpg

Lo leo en el Blog de Lucila y en Ubuntips
Es un documento de Santiago Roza que me parece muy interesante, como es un documento libre y pide que sea difundido. aqui lo transcribo:

En los últimos días, la conocida empresa de software Microsoft declaró que el sistema operativo libre GNU/Linux supuestamente violaba más de 200 de sus patentes [1]; y que esa era la razón de su alto nivel de calidad, por el cual hoy lo usan la mayor parte de las grandes organizaciones [2].

Aunque afortunadamente todavía no existen patentes de sofware en nuestro país, consideramos que es importante aclarar en esta ocasión algunos conceptos sobre este tema, y explicar por qué razón las patentes de software resultan muy nocivas para cualquier sociedad.

Antes que nada, recordemos que una patente es algo muy distinto del derecho de autor (o copyright): mientras que el copyright concede derechos exclusivos al creador sobre su obra en particular (un libro, una pintura, un software, etc), una patente “protege” algo tan general como un método, un proceso, un estándar, o hasta un concepto [3] [4].

Para dar un ejemplo, el copyright impide que copiemos una novela de García Márquez -sin una licencia de su autor-, mientras que una patente impediría crear cualquier otra novela que se basara en el concepto de “realismo mágico”. Y hasta podría existir otra patente mucho más general, que restringiese la creación de cualquier “novela”.

Si bien las patentes presentaron cierta utilidad, especialmente para algunas invenciones de existencia física, y dentro del marco histórico en el que fueron concebidas -siglos XVI y XVII-; jamás fueron un elemento determinante en la historia de la mayoría de las artes y de las ciencias, que afortunadamente siempre se desarrollaron sin esta clase de restricciones.

No patentó nunca Newton las ideas que luego revolucionaría Einstein; mucho menos tuvo que pagar regalías Marx para discutir las teorías de Adam Smith. Y por supuesto que jamás enfrentó un juicio Dalí porque André Breton hubiese patentado el Surrealismo. Otro sería el mundo que nos rodea, si las cosas hubiesen funcionado de esa forma.

Y en el ámbito del software, el obstáculo de las patentes resulta aún más grave que en cualquier otro, ya que un programa de computadora es una combinación compleja de cientos de algoritmos, funciones, patrones y formatos. Por eso hoy resultaría casi imposible escribir un programa nuevo, sin reutilizar muchísimos elementos ya descubiertos hace tiempo.

Es por eso que el software nunca ha sido patentable en casi todo el mundo, incluyendo la gran mayoría de los países europeos. Y ni siquiera en los EEUU -hoy el gran impulsor de las patentes de software- existieron hasta los años ’70-’80; con un crecimiento exponencial desde finales de los ’90 [5].

Y aunque parezca irónico, recordemos que hasta la propia Microsoft construyó todo su imperio sobre ideas ajenas, nunca patentadas: por ejemplo sus programas de oficina son muy similares a otros más antiguos (como WordPerfect [6] o Lotus 1-2-3 [7]), y hasta la interfaz gráfica de Windows contiene muchos elementos de las antiguas Apple Macintosh (y hoy, de las nuevas Mac) [8] [9].

El mismo Bill Gates declaró hace algunos años -en un memo interno a sus empleados- que “[de ser por las patentes de software] la industria estaría hoy en una parálisis completa”, y que “una pequeña empresa sin patentes propias, se vería obligada a pagar cualquier precio que los gigantes decidiesen imponerle” [10].

Es por estas razones que el anuncio de Microsoft constituye una gran preocupación no sólo para toda la industria del software, sino para el resto de la sociedad, que hoy depende directamente de ella.

Aunque la compañía ya ha admitido públicamente que no es su intención iniciar juicios contra los usuarios de Software Libre [11]-lo que sería muy poco práctico, ya que la mayoría estas patentes son difíciles de defender legalmente-; el objetivo evidente (y casi admitido) es crear miedo e incertidumbre, para así provocar acuerdos de patentes como el que Microsoft cerró recientemente con Novell [12].

En esta clase de “pactos de no agresión“, una empresa permite a la otra el uso de sus respectivas patentes (y viceversa), en general a cambio de algún pago por parte de la menos poderosa. Pero de ese modo, se dejan totalmente expuestas a las ONGs, los Estados, las PyMEs y los particulares; que no tienen ninguna patente para ofrecer.

Bajo un modelo como ese, toda la producción de software quedaría monopolizada por cinco o seis proveedores multinacionales -los únicos capaces de negociar acuerdos de patentes en condiciones aceptables-; con todo el resto de la sociedad sujeta a regalías impagables, sobre miles y miles de patentes dudosamente “innovadoras” (y muchas de ellas hasta ridículas) [13] [14] [15].

Esto es, casi sin ningún control para usar y modificar el software; ese mismo software que controla nuestros hospitales, nuestras votaciones, nuestros cajeros automáticos, nuestras escuelas; nuestra identidad y nuestras vidas. Sin ningún control sobre esa misma “sociedad de la información y del conocimiento”, de la que tanto se habla.

Por eso desde este artículo llamamos a terminar, de una vez y para siempre, a nivel mundial, con este sistema ridículo de patentes de software; que beneficia a unos pocos en perjuicio de toda la humanidad. Para que el día de mañana puedan aparecer un nuevo Boole, un nuevo von Neumann y un nuevo Turing. En resumen, para que la informática pueda seguir desarrollándose como lo ha hecho siempre, sin “incentivos” tan dudosos como una patente.

En resumen, y como dijo alguna vez Isaac Newton: “Si es que yo pude ver más lejos, fue porque estuve parado sobre los hombros de gigantes” [16]. Esa fue siempre la filosofía que impulsó el desarrollo de las ciencias, de las artes y del pensamiento, a lo largo de la historia de la humanidad: construir sobre lo que otros nos han legado antes.

Hoy esa visión que tan buenos frutos nos ha dado, se ve amenazada por las acciones de verdaderos “enanos” morales, que en contraposición con aquellos “gigantes” que construyeron nuestra historia, preferirían relegar al mundo nuevamente a las cavernas, si con eso pudiesen hacer subir medio punto sus acciones. Estará en nosotros, y sólo en nosotros, hacer las elecciones correctas para conseguir el futuro que queremos.

Santiago Roza – santiagoroza@gmail.com

(texto publicado bajo las licencias Creative Commons Attribution y GNU FDL; a elección del lector)


[1] http://money.cnn.com/magazines/fortune/fortune_archive/2007/05/28/100033867/

[2] http://en.wikipedia.org/wiki/Linux_adoption

[3] http://es.wikipedia.org/wiki/Patente

[4] http://en.wikipedia.org/wiki/Patent

[5] http://en.wikipedia.org/wiki/Software_patent#History_and_current_trends

[6] http://en.wikipedia.org/wiki/WordPerfect

[7] http://en.wikipedia.org/wiki/Lotus_1-2-3

[8] http://en.wikipedia.org/wiki/Windows_2.0#Legal_Conflict_with_Apple

[9] http://en.wikipedia.org/wiki/Criticism_of_Windows_Vista#Similarities_with_Mac_OS_X

[10] http://eupat.ffii.org/archiv/zitate/#bgates91

[11] http://www.informationweek.com/news/showArticle.jhtml?articleID=199501831

[12] http://en.wikipedia.org/wiki/Novell#Agreement_with_Microsoft

[13] http://www.cs.unimaas.nl/p.spronck/RidiculousPatents.htm

[14] http://www.newscientist.com/article.ns?id=dn5072

[15] http://news.zdnet.co.uk/itmanagement/0,1000000308,39157145,00.htm

[16] http://en.wikipedia.org/wiki/Standing_on_the_shoulders_of_giants





¿Es compatible tu equipo con Ubuntu?


( Muchos fondos de pantalla, aqui )

DESCARGATE SCIFI LIFE

365 Dias de Soledad
Me debes los sueños, las promesas y las noches rotas. Me debes la paz, la sonrisa y la esperanza robadas. Me debes la sangre, las lágrimas y el sudor vertido. Me debes las noches vacías, los abrazos anhelados. Me debes un beso de ajenjo de tu amarga boca.

The Ubuntu Counter Project - user number # 11961
Geo Visitors Map

Archivos

mayo 2007
L M X J V S D
 123456
78910111213
14151617181920
21222324252627
28293031  

Blog Stats

  • 31.082.599 hits