3 de agosto de 2016

Memoize in Java with Guava

An example of memoizing, to copy, paste, run, learn, whatever.

Warn

It's supposed you to know what Guava is, what memoize is, when to use, benefits, cons, etc..

Right now, the example



Further Reading


Guava Caches Explained
Memoization Wikipedia


11 de marzo de 2015

Diálogo con el sistema

¿Puede un producto existir sin la sociedad y sin el ecosistema que lo aloja?
¿De dónde sale? ¿Por qué los productos sólo hablan de sí mismos en sus etiquetas?
¿Qué más pueden decirnos?
¿Hay algo que tenga que ver con todos nosotros ahí?

Un buen producto

Si leemos los datos que traen las etiquetas de productos y vemos sus publicidades, pareciera que no nos importa de dónde salen, de qué manera se logran esos productos: su impacto ambiental y social; es como si no quisiéramos pensar más allá de lo que dice la etiqueta y el precio, ¿qué otros efectos puede acarrear sobre nosotros mismos? ¿será que realmente no nos importa? Nuestra vida al menos nos importa, quizás nos cuesta asociar cómo es que algo mejor pueda al mismo tiempo estar empeorando a otra cosa, este tipo de conexión queda oculta, como si “la contaminación y la explotación laboral no tienen nada que ver con lo que compramos”, como si fueran cosas independientes, cuando no lo son, por el contrario lo que compramos está íntimamente relacionado al ambiente y la sociedad, ¿qué nos confunde para no verlo? posiblemente que no tenemos indicios claros de esa relación, nos faltan pistas para poder asociar y ver el efecto de tiene cada producto en un escenario más grande, estos efectos nos quedan ocultos, sea intencionalmente o no, pero somos al menos responsables de preguntar, porque seguramente el precio, la calidad y cantidad, no alcanzan para verlos. Empecemos a hablar de esto.

¿Qué es un buen producto? ¿Bueno en qué? ¿Gusta? ¿Dura mucho?¿Es lindo?¿Ayuda a alguien?¿Tiene mucha publicidad? ¿Es de una marca reconocida? ¿Es barato? ¿Es caro? ¿Me lo recomienda alguien? ¿Me da trabajo? ¿Me da ganancias?...

Necesitamos más indicios sobre lo que nos importa para que se genere una realimentación positiva o negativa sobre esos asuntos que sinceramente queremos propiciar o rechazar. Si nos ocultamos esto, si la calidad o cantidad se piensan desconectadas de su impacto ambiental, laboral, social, por más que tengamos buenas intenciones y productos “más baratos y mejores”, pero a costa de un peor mundo, no luce como buen plan.

Quejarse del sistema como algo externo, es engañoso, como si no estuviera constituido por cada uno de nosotros, es como mínimo ingenuo, “no es mi culpa, es el sistema”, este es un intento de renunciar a toda responsabilidad y libertad.

¿Qué pistas tiene un consumidor[1] sobre el efecto de su compra? ¿El precio? Definitivamente podríamos indagar un poco más, al diálogo entre el consumidor y el productor le faltan palabras, se necesita ahí una comunicación bidireccional y más amplia, para no sólo charlar acerca de los productos en sí sino también acerca del mundo, no alcanza con hablar de las características del producto y el precio ! muchas veces son esos los únicos temas a tratar en el proceso de compra, en publicidad, etc.. lo cual es una comunicación engañosa; lleva a creer que “pagando” se terminan todas las responsabilidades, que si algo se puede comprar ya está, es una forma irreflexiva y peligrosa.

[1]consumidor, productor, trabajador, empleado, etc.. dicho sea de paso esas denominaciones pueden ser degradantes para el ser humano si intentan reducir todas nuestras dimensiones a una función.

Causas y efectos

"Preferiría comprender una sola causa que ser Rey de Persia." -Demócrito.

La relación entre el producto y su impacto social, laboral, ambiental, es muy compleja, a veces de cierto compromiso inadivinable, por dar ejemplos, podría ser que la energía nuclear, y su riesgo de esparcir contaminantes que duran miles de años, nos provea sin embargo energía mientras para encontrar otra nueva forma más limpia, o que gracias a una minería contaminante, que hoy destruye glaciares, montañas y contamina el agua, se permita extraer materia prima : oro, cobre, etc.. para hacer microprocesadores, cables.. tecnología que puede ser usada para proteger al medioambiente, o que nos permita comunicarnos con ese fin, etc, estas paradojas suceden, por eso el purismo suele ser nefasto, porque los caminos indirectos son ciertamente posibles, sin embargo no lo sabemos de antemano, por lo tanto es una apuesta a lo desconocido, es imposible predecir el impacto total de un producto o acción (ya querer deducir ese impacto mirando el precio es directamente un insulto a la razón). Podría darse lo opuesto, que si no admitimos ciertas prácticas, que hoy sabemos riesgosas o contaminantes, podamos ingeniarnos formas alternativas de adaptarnos ¿Qué opción tomar entonces? “no sabemos qué pasará en el futuro”, justamente, pero ¡la falta de predicción no sirve de excusa!, que existan límites en nuestra razón no nos prohíbe actuar a partir de una ética, de una responsabilidad personal, al contrario, justamente donde no podemos saber, es donde nos podemos expresar personalmente, donde la ética se vuelve fundamental. No es tan importante que cada uno acierte perfectamente en qué cosa impactará mejor o peor, importa que no renunciemos al intento, que no renunciemos a nuestra propia capacidad de reflexión.

La ética puede aparecer siempre y cuando se incluyan en el diálogo temas externos al producto; si insistimos en seguir hablando de precios, producción, proteínas, píxeles, es porque evidentemente seguimos confundiendo, ocultando o negando los efectos y las implicancias éticas, ambientales de cada uno de nuestros productos y acciones.

Se le suele exigir a una empresa ¡mejor señal de teléfono! “estoy al día con el pago y no puede ser que no funcione!”... las mismas personas que exigen señal de teléfono suelen protestar para que “¡retiren las antenas de telefonía del barrio!’” este es un ejemplo que grafica una actitud generalizada, la paradoja de querer algo sin consecuencias, ni siquiera querer conocer que existen consecuencias, hay una creencia en que “algo o alguien” debe garantizar el servicio, hoy estamos “exigiendo” productos o prestaciones de servicio ignorando de qué manera se logran; lo que estamos haciendo es pedir que nos mientan.

Y sobran los ejemplos; cuando ocurre un corte de energía eléctrica, se suele culpar a la empresa proveedora, sin considerar nada, no importa si ocurre en medio de una tormenta, ni que un vecino sea quien tenga que salir esa misma noche a cambiar fusibles o reparar cables bajo la lluvia arriesgando su vida ¿Sabemos que las “empresas” y los “estados” son personas? ¿Tenemos claro eso? ¿Nos basta que sea “un desconocido”, “un empleado” para tratarlo como máquina? Si se corta un servicio se la responsabiliza a una empresa, o a un estado, a entes abstractos, se balbucea “yo pago mis impuestos, acá faltan inversiones, etc..”, pero en última instancia siguen siendo personas las que tienen que llevar adelante esas tareas, por ejemplo sosteniendo guardias nocturnas para cuidar el funcionamiento de los sistemas, esto no se menciona, tampoco solemos pensar que al encender una luz, para "generar" esa energía, hay combustible fósil quemándose del otro lado de la ciudad, junto con más personas dedicadas a atender que eso funcione; preferimos pensar que “para algo cobran un sueldo, eso es responsabilidad de la empresa generadora, yo pago al día mi factura”, como si la naturaleza entendiera de explicaciones burocráticas, como si se nos eximiera toda responsabilidad y efectos al pagar una factura. “Pagar el producto o servicio legalmente” eso no alcanza, ni legitima ninguna acción, es una idea errada, intenta reducir nuestra responsabilidad a la única dimensión de dinero, y falla, es una actitud que va directamente en contra de nuestro medio ambiente y nuestras vidas. “No me importa cómo pero..” ¿No te importa cómo?... Cuando estamos del otro lado, cuando nos toca vivir de cerca la presión de un cliente incomprensivo, alguna empresa que nos exige más horas de trabajo, de algún estado perseguidor, de malas condiciones laborales, cuando una empresa tira contaminantes cerca de donde vivimos, ahí no nos agrada, pero vemos a la “empresa” o al “cliente” o el “estado” como ente abstracto y ‘enemigo’, pero pensemos que esa indiferencia e intolerancia de la empresa está relacionada al pedido intolerante e indiferente de los propios clientes, así como la indiferencia e intolerancia del estado está relacionada al pedido intolerante e indiferente del ciudadano ¡de nosotros mismos cuando estamos del otro lado del mostrador!.

Somos el sistema, y olvidar eso, olvidar que hay una íntima relación entre nuestras exigencias y cómo se hacen realidad, es no tener en cuenta a los demás, que en un rápido boomerang, es no tenernos en cuenta a nosotros mismos.

Muchas veces la misma persona que se queja de un mal es precisamente la que está generando esa necesidad, podemos ser cómplices de nuestros propios problemas, el productor por no decirlo y el consumidor por no preguntarlo.

Es cierto que la complejidad oscurece la relación entre las decisiones individuales y los efectos sociales, pero eso no es excusa, no para negar la relación! Los estados, empresas y sistemas son compuestos por personas, y son muy sensibles a nuestras acciones individuales, por más que parezcan entes externos abstractos, y por eso la ética individual de sus componentes (nosotros) y nuestras decisiones personales diarias son tremendamente importantes, nuestras acciones son las que componen a los sistemas, de un lado y del otro, como trabajadores, como clientes, como ciudadanos, como funcionarios, como gobernantes, como seres humanos. Si nos preguntan ¿cuánto consume el celular?, nos cuesta ver el contexto, enseguida pensamos en el aparato, pero no nos damos cuenta que no alcanza con un teléfono aislado!!, porque poder comunicarnos la existencia de los demás teléfonos es obligatoria, sin contar el consumo de las centrales, etc.. Por lo tanto para que un teléfono cualquiera pueda comunicarse con otro cualquiera debe estar funcionando toda la red. Nunca se trata del impacto de “un producto” “un celular”, “una persona” aislado, sino del impacto del hábito social, es “tener celular” lo que consume en el mundo miles de millones de Watts. Por lo tanto no se puede aislar el comportamiento, tener teléfono implica a todos los teléfonos.

La burocracia que separa al consumidor de un producto de su elaboración tiene un costo social y ambiental, presionar un botón y tener un producto en la puerta, parece un éxito tecnológico que invisibiliza los mecanismos, pero no hay que olvidar que también invisibiliza consecuencias y riesgos.

Educación

A veces se proponen cosas como más educación, “Si la gente supiera un poco más sobre.....” propongo que ideas le erran al problema, no se necesita saber más electromagnetismo para asociar que si uno quiere tener señal en el teléfono se necesitan poner antenas, tampoco requiere saber detalles sobre generación eléctrica para entender que si gastamos energía ¡ésta de algún lugar sale!; para ser mínimamente responsables con esos conocimientos alcanza, la educación específica es importante para dar prestaciones más eficientes, pero no resuelve el problema de la irresponsabilidad, ignorar es intrínseco a nuestras limitaciones y a la complejidad del sistema, por eso proponer que cada persona profundice en “todos los asuntos” es irrealizable, pero eso no nos exime de responsabilidad, por eso la educación debe saber que inevitablemente vamos a ignorar detalles, y a la hora de elegir cuáles, es preferible que no seamos nosotros.

La educación de conocer nuestras limitaciones y nuestro gran impacto, nuestra libertad y responsabilidad, de saber que nuestras acciones tienen consecuencias en otros y en nosotros, esa es una educación necesaria.

Si alguien considera utópica la acción de intentar alinear los objetivos de una sociedad y el medio ambiente con los de los estados, las empresas y productos, es quizás porque no considera lo mucho más utópico que es no hacer nada, seguir comprando cualquier cosa y exigiendo irracionalmente; consumir, culpar a otro y esperar que así se resuelva mágicamente.

¿Se imaginan a empresas, estados compitiendo pero para ver quién contamina menos y cuál da mejores condiciones a quienes la componen? Eso no depende (solo) de la decisión de un empresario o un estado, sino también de qué intereses expresemos cada uno, si nos interesa el precio, el sueldo, la cantidad, la “calidad” (sólo del producto), entonces estamos llevando a nuestros sistemas a competir por esas cosas, que a la larga son irrelevantes, pero si nos interesamos por otras cosas, ahí llevaremos a los sistemas.

Enfrentar responsabilidades individuales quizás nos parezca que requiere gran esfuerzo, pero de nuevo, quizás no estamos considerando el esfuerzo que ya hacemos cotidianamente para lidiar con la irresponsabilidad distribuida que implica convivir en un mundo contaminado que compite por cosas que no nos importan.

Parafraseando a Sartre, usted y yo somos libres, responsables y sin excusas.




29 de diciembre de 2014

Automatically store git hash inside C source

Sometimes we need to know what exact revision is a software. This doesn't work

#define VERSION 1.2

Just because it won't be updated by anyone.

On the other hand if using git, we could insert part of the revision hash automatically
  • With a batch file
  • Running the batch file from makefile in every build to avoid any manual task
Here is how

Edit makefile to insert code in build-pre section


Create the batch file version.bat to generate version.h with the hash constant inside



The automatic generated file will be something like this

#define VERSION "877bd1"

Wherever we need to use this version hash, this file must be included

#include "version.h"

Important

Add version.h to .gitignore to avoid modifying hash while build

Final Note

The git sha-1 hash will only acknowledge for changes in current project, if the code depends on other, the proper sha-1 code must be included (or a combination).

Reference and related info
This stackoverflow question

12 de diciembre de 2014

Wey

<sarcastic>

Hice una página Web maestre, más que Web, es Wey. Se puede ver a cualquier hora and lugar, te libera de dependencias antiguas de recursos, espacio y tiempo, cosa de antepasados yeah, somos el futuro man, ve mis anteojos.

Instalé DNS en Argentina, server in USA, una combinación barata, alquilé un full pack que incluye Content Manager ahorra el tiempo, no tengo que instalar ni saber nada, las imágenes fueron a parar a un CDN (Content Delivery Network) servidores distribuidos, copias ready men, para que carguen más rápido, la página trae novedosas librerías en JavaScript, .js, frameworks que la surfean, son fireworks, te los carga directamente desde github.com, todo open chaval, ahí colgué también videos de youtube , links a wikipedia y unas twitts, ¿que cómo hice? relaaajate maese, código embebido, copy+pasta, los agrega en formato cool con sus fechas, all ok Jason.

Monetizo con AdSense, publicidades de google al costado, a la carta. ¿Si podés hacer comentarios? évidemment!, hosteados por Disqus te maneja todo el tema. Podés compartir todo, tira links para share de pinterest, instagram and so on, whatever uncle.

Podes descargarte my App también, desde Google Play, con el usuario mismo de facebook, tres click y te sincroniza todo, va que va. -Interconexión gurú man- ¿Si este post tiene de esos vicios? claro zen, va que va, es la autoreferencia tigre! Tú, chaval, turbina, gatún, ratatuil, que no entiendes, we la people de la internet descubrimos el world, logramos independencia totale, anotá en la historia, esto ladies and gentleman, son decisiones objetivas, libres, es captar la onda pana, sheer efectivity.

</sarcastic>

Consejos para usted que también es cool

  • Al independizarse, vea si no termina en una dependencia más extrema que la inicial.
  • Al batallar contra energía y espacio-tiempo, tenga en cuenta : el juez es el tiempo.

3 de diciembre de 2014

Are you a robot?

reCAPTCHA demo: Simple page

You may be wondering, how can this possibly work ?
Here is my guess: it doesn't.

Source
No CAPTCHA reCAPTCHA

17 de septiembre de 2014

The shape of f





flirt = function(){ };


/* fashion, do with no content */




19 de agosto de 2014

Espresso

Espresso is a software for reducing the complexity of digital electronic gate circuits.

I've discovered it by chance, it's oldie, but useful!, so here an example just as a reminder.

Simple usage


One step: put a truth table in a text file

#  test.txt
#  It's plain text, and these are of course comments.
.i 4 # number of inputs
.o 4 # number of ouputs 
.ilb A B C D # input labels
.ob F G H I  # output labels
#The truth table. 
#On the left the inputs, on the right the outputs
#'-' means 'any value'

0 0 0 0 1 1 0 0
0 0 0 1 1 0 0 1
0 0 1 0 1 0 1 0
0 0 1 1 0 0 1 1
0 1 0 0 1 1 0 0
0 1 0 1 0 1 0 1
0 1 1 0 0 1 1 0
0 1 1 1 - - - -
1 0 0 0 1 1 0 0
1 0 0 1 1 0 0 1
1 0 1 0 1 0 1 0
1 0 1 1 - - - -
1 1 0 0 1 1 0 0
1 1 0 1 - - - -
1 1 1 0 - - - -
1 1 1 1 - - - -
.e

Ready, now get the equations !


>expresso.exe -o eqntott test.txt
F = (!B&C&!D) | (!B&!C&D) | (!C&!D);
G = (B&C) | (B&D) | (!C&!D);
H = (B&C) | (!B&C&!D) | (C&D);
I = (B&D) | (!B&!C&D) | (C&D);

done!


Here is a download link :
http://www.sontrak.com/download/espresso.zip
l


Espresso copyright © 1988-1993, Regents of the University of California.

11 de febrero de 2014

The Kerckhoffs's Principle

Auguste Kerckhoffs was a linguist and a cryptographer who, back in 1883, published various essays about Military Cryptography (two words usually related, but not necessarily). Kerckhoffs's principle is one of the many rules of thumb included in his essays, it reads as follows: «The design of a system should not require secrecy».

What does it means!? Here, we'll try to unravel it, reviewing its meaning and questioning our understanding about what privacy is.

What's to hide for concealing

Keeping a secret is about restrict its accesses, avoiding the unintended, while allowing those intended, but as you could imagine, it's not easy to distinguish intentions, nor intention's owners. Secrets need to be visible for some, and invisible to others, so how to hide? what to hide?. Kerckhoffs's principle can also be stated in this way "A cryptosystem should be secure even if everything about the system, except the key, is public knowledge", and it immediately makes sense: "A house should remain secure even if everybody knows where the door is!".

Today we are already using some form of data encryption on most of our global communications, and most of these systems were designed being aware of this principle, it means that its designs are not secrets, but what is hidden are their keys, like the passwords, secret questions, among other kinds of keys.

Can a secrecy system be perfect?

Claude Shannon asked it before us, and he answered yes; how? by using a random different key for every single message, and being each key the same length as each message. This schema is called -random one time pad-, the method is like using a random invented language for every word, even for every letter we write, so a third person will find impossible to decipher our conversation from there, because the encrypted message will have no clues of the original message, but it's not a very practical technique. Why? Well, how we will tell the other what random language/keys we are using for every word? Could we both have a list of the successive language sequence? Perhaps, but how to send that list? What if someone else see our list of keys? Once you have random numbers written in a list, are they still random? as you could see randomness is fragile. So, can we send those varying keys along with the messages? Well, yes, but sending our messages along with its translations would not hide them for too long[1]. Shannon "one time pad", despite not being very practical, it's unbreakable, and is Kerckhoffs-approved!, because it's a public mechanism where all its successive keys are hidden.

[1] For completeness sake we have to mention that it's possible in principle to send keys through a Quantum scheme, but that's very far from our issue now

Why does it work?

An obvious question arises, how designs which meet Kerckhoffs's Principle can lead to a stronger cryptosystems than without using it?. Let's fall in the extreme opposite naïve case of using only a hidden secret mechanism to encode a message, with a fixed secret (a not changeable password), this would be like hiding a secret with another, as having a secret passage door, but without lock (perhaps behind the bookcase), yes, the system will remain secure but only until it's found by an attacker, since then, all successive communications will be endanger, and even worse, it would take a long time to redesign the whole system, so it will be compromised for that while. These methods are called "security through obscurity" to belittle them, it refers to designs that hide mechanisms that are not easily changeable, imagine you have to give a specific shape and colour to a complex physical machine to fits certain hiding place, with a camouflage colour to blend into that background, it could ends up having a clumsy shape, perhaps not very suitable for what it was designed[2], and if "enemy" discover our hiding place, we have to re-conceal the machine elsewhere, shaping it again and painting every gear again; a bad idea.

Shannon outlined Kerckhoffs idea in a minimalist way: «The enemy knows the system», a straightforward manner to encourage designers to consider that others may already know our security mechanism, to be ready for when that happens.

On the other hand, a secure algorithm means that, without the proper key, it will forbid the access to protected data (or make it very difficult), even knowing how the system works, no right key, no right data, it also needs to be fast enough to be useful in practice; so if a key is compromised it can be changed faster than replacing the whole algorithm (Analogy: changing the locks is a lot easier than making a new door!, so a secure algorithm is like a well-crafted door).

If those techniques are used together, a hidden password plus a hidden and secure algorithm, it could lead for a while to a stronger and harder to break system than applying only one strategy at a time, of course if we were constrained to choose only one of them, in principle, the hidden key strategy alone is a lot harder to discover and faster to change than the hidden mechanism alone.

[2] Except that the machine were specifically built for hiding purpose only, with no other function, that would be a funny exception.

Hiding passwords vs hiding algorithms

Until now we were comparing the time and resources it takes to redesign a whole system, versus what it takes to create a new password; and it turns out that passwords can be produced faster (and cheaper). Now let's consider a different and also important question, Is it easier to unravel a hidden algorithm than a hidden key?

Yes, although in practice it depends, in theory it's a resounding yes, we can even explain it without using analogies of secret doorways nor hidden machines, the fact of the matter is that most of any working algorithm needs an inner structure to work, and cryptosystems algorithms are not an exception, they usually need an structure, while passwords doesn't, so in general it's theoretically easier to get clues of that structure, to reverse-engineer or find patterns on an obscure machinery design, than to "reverse" a password that has no design structure at all by definition.

Why it doesn't

So far so good, but those are theoretical differences, however in practice the enemy often doesn't know the system, and some hidden mechanisms remain hidden, moreover although there is nothing behind a password to be reversed, in practice we don't pull passwords out from a hat, and generating a password related to nothing is not an easy job (and of course, the names of your pets are not a good resource). Anyway Kerckhoffs's principle is just a design criterion for cryptosystems, is a warning, not a full instruction manual, isn't it?.

Trees, forests, and standardized yardsticks

Is a public algorithm better than a private one ?[3] This is often a topic of discussion (or even a non debatable topic), since any volunteer observer can review the public mechanism and report a bug, as well as could be the first of taking advantage of it without reporting anything, etc... But such discussions end involving people and trust (not even a perfect system could abolish these issues); so it might or it should lead us to ask, how much does the algorithm matter? what's the relative importance of an algorithm design over others factors? Ok, it's probable that a reviewed public algorithm can be more secure than a private one, but having so many other affecting things around, the question could be very misleading!. "Well, someone have to take care about the algorithm", but if the algorithm ends in a global usage recommendation, that's no longer about the algorithm.

[3]In this context the use of the word public only means that the mechanism can be known by everybody, and private here means that inner mechanism are intended to be hidden, it has nothing to do with public goods from a state nor private goods from individuals, please don't confuse them.

What questions we make to history?

The Enigma Machine was a cryptosystem used during World War II, whose encryption it's said it was broken because of some human errors together with a poor security design based on hiding the machinery (it was NOT Kerckhoffs-approved!). This example from history is often shown as a kind of triumph of the theory, sometimes it's used to show how security through obscurity is poor, and how it has failed in practice.

But there are more details that worth to mention; for example, what resources were used to break it? There were a lot of people at the time involved in trying to break Enigma Machine from many powerful countries (including Alan Turing ). So, was it easy to break it?. How hard it could be to break many many different Enigma like Machines? (We have already ran out of Alan Turing's, and alternates will not be enough for every machine), I think that a large number of hidden machinery would be still a hard subject, because obscurities are not all created equal.

We should also emphasize that Enigma is not a good pedagogical example, it's misleading from scratch, because the system was used to hide war movements, so it's not an example that let us focus on cryptography, it's about war, so what is the point of coldly pointing out the weaknesses of this system ? In which sense we are saying that a more secure system would have been better? Are we suggesting to use better systems for a next war? It sounds like an advertising from an unscrupulous seller of war cryptosystems. There is no such thing as the best system isolated from all else, on the contrary, any criterion about what is best is related with people and even with everything else. Secrecy is not only about war, it's about privacy, and it's about having a space to think for ourselves, to talk with our partners, with our loved ones, with all our recipients, and with no one else.

History again: Scope, global and local

The world has learned Kerckhoffs's principle, among other theories. Today we are all using the same tested algorithms to protect everyone's privacy (?), all for one, and one for all. Despite of that, there is a huge and growing lack of privacy, and every human word, every move is being recorded in computers. If a system knows in advance what our movements are, then under certain circumstances it could anticipate our next moves, we can be controlled by that system, be the government, be the market, be Skynet, or whoever. Is that what we want? If not, are we doing something wrong? what can we do better? The algorithm? Maybe not!, by getting the best ever public algorithm (and even because of it) the scope of its use could become dangerously global, as well as its flaws, sometimes the best is the enemy of the good.

The global: we have evolved a technology that let us communicate worldwide using same symbols, protocols, using converters, automatic translators, and compatible systems, our data is now spread worldwide like never before in history, our scope became worldwide, while most of us have a localized life, and all of us have a limited capacity to cope the whole world, certainly not enough to live spread globally as data.

There is a singular and well known story over this issue that could be traced back to the Bible, it's called The Tower of Babel, and goes something like this: there were people trying to build a big tower, so high, that it reaches heavens, what for? to avoid being scattered around, to give themselves a name, but then The Lord confuse their languages so they will not understand each other, that's it. Something similar is happening now, we could "reach heaven" (at least some internet clouds) by sharing, and through world cooperation, but that's not easy, our selfishness, our myopia, evilness, desire of control, request of control, and so on, in resume: all of our human limitations, leads us to the need of different languages, localized, limited, like echoing our own limitations.

The local hit again: what if many universities, countries, districts, companies, groups of people uses each one a particular non-standard communication algorithm, then they can not be understood globally, but strangely as it could seems, that's sometimes what we want. Kerckhoffs's principle doesn't imply we should use all the same method. A single secure algorithm for all ? Is this idea a gimmick invented by those who want to spy easier? What about one hundred million of unknown private methods? But that way we would lose Babel, but Babel tower is dangerous, and so on...

That it's all just a little bit of history repeating

Human future, theory and practice

We face today a worldwide vulnerability on privacy (or voluntary surrender of privacy), inside and outside computers, and as with many other humanitarian problems of higher priority, the answer can't just be "maths is ok", because perhaps we knew that already, or nobody ask about it, we are facing problems of many levels, requiring everyone's voices and presence, it's self evident that is not enough to talk about algorithms. Encryption systems are issues of computational science mainly because secrecy and privacy are issues of human life.

A mathematical model could be perfectly correct, but applying it unquestioningly is definitely wrong, it's the old issue about the tools and its different uses, today's problems of privacy are also ethical problems, and there is an opportunity for scholars to speak about this, to join discussing about differences between general and particular, between theory and practice, to help practitioners by challenging them to think, as well to be involved in ethics, it's fine to know a theory, provided that the personal views are never silenced; but surprisingly enough the opposite advice is often given, encouraging to stick the theory, to follow the proven rules, it's like saying "don't think for yourself, someone already did it for you", but nobody can think for someone else!, it's a lie, and a very rotten idea for a general approach, "don't reinvent the wheel" is sometimes confused with "don't think for yourself", although it may be an efficient tactic for certain works, it's a very dangerous and profoundly sick ideology.

Computer software interacts with communities on a daily basis, so there is no excuse for being "detached from algorithms consequences", we should accept some kind of responsibility regarding this ways of acting. Scientist needs to think outside science. Making pure science seems like heating pure water, both may boil over.

We are humans, it's a pretty relevant fact to put aside, or it should be, dehumanization of exact sciences is sometimes getting as far as "the abstraction from being a human", and we should face that it can have very harmful consequences that are not only humanitarian ones, but also technical.

Using distributed systems, does not guarantees privacy, the central topic here is not what system is better for avoiding some limitations or weaknesses of human behaviour, but just the opposite, i.e. to avoid ignoring it, to be aware of our limits, and ourselves. What could it mean wanting to implement a single global and infallible security system but a dangerous act of alleged omnipotence that we don't have? Either the attempt of making a global system to spying, or the attempt of making a global system against spying, are two faces of the same mistake.


References

A book about cryptography history
http://simonsingh.net/books/the-code-book/

A great post talking about ethics in science
http://devlinsangle.blogspot.com.ar/2013/08/will-this-mathematics-be-of-any-use.html

A related video
http://www.youtube.com/watch?v=KsN0FCXw914

Wikipedia links
http://en.wikipedia.org/wiki/Auguste_Kerckhoffs
http://en.wikipedia.org/wiki/Claude_Shannon
http://en.wikipedia.org/wiki/One-time_pad
http://en.wikipedia.org/wiki/Enigma_machine

xkcd
http://xkcd.com/538/



9 de enero de 2014

Builder Pattern in Java, by an example.

This is an example of the builder pattern. To copy, paste, run, learn, whatever.

Warning
It's supposed you already know why you want to use the Builder pattern, its benefits, cons, etc..

Right now, the example



What did we do?

We needed a class with some properties (of course!) and another class for building it.

1-TheClass

TheClass must have a private constructor, accepting a Builder object as argument

2-Builder

Builder, an inner public static class named Builder(or as you like), with same properties as TheClass.
Builder properties can have default values.
Builder must have a public constructor accepting as arguments all the required properties of TheClass.

3-Methods

Set methods are in Builder class for filling the optional properties of TheClass.
Those methods returns "this" i.e. a Builder object so allowing calls to be chained, like setThis(x).setThat(y).setThose(z)
Finally to create TheClass object, the cherry on top is a build() method, using new internally, and returning it. The body of build() is:
TheClass build(){ return new TheClass(this);}

4-Test it!: Creating a TheClass object

Get a static Builder(with required arguments), set optional properties(chained), and build()!


Further Reading
Some links for those who prefer reading over trying and clicking over googling.
Builder Patterns explained by Joshua Bloch
StackOverflow:Builder Pattern
StackOverflow: Method chaining - why is it a good practice, or not?


8 de diciembre de 2013

Vida Útil

La sociedad le dio la espalda a las computadoras durante medio siglo, no importaba que hubiera computadoras abordo de un avión, en los bancos, en satélites, en video juegos, en centrales de energía, en centrales telefónicas, en medicina, pero ¡ Qué podría importar todo eso ! "deben ser cosas de técnicos, complicados estudios y aparatos para gente especializada (o incluso aburrida)", "que se encargue otro de eso". Las escuelas, en consecuencia, no incluían ninguna cosa que se le pareciera a la programación. Durante ese mismo periodo de tiempo, sin embargo las escuelas sí propusieron otras cosas en sus planes de estudio por ejemplo enseñanzas sobre nombres de ciudades y de ríos lejanos, detalles de batallas militares, fechas de eventos, hasta incluso contabilidad, pero programar no.

Pero estos últimos años las computadoras aparecieron en primer plano apresuradamente (diría violentamente), ahora ya son inevitables, inexcusables, ubicuas. Se escucha decir entonces, casi como una consecuencia causa-efecto: "Quizás se debería enseñar a programar en las escuelas". Siento un poco de nostalgia y hasta cierta ternura al escuchar ahora hablar de algo así, que me hubiera gustado oír hace más de 20 años, cuando iba a la escuela y quería programar, me preguntaba ¿Cómo se hará un video juego, un robot?. A la vez, y por la misma razón, no puedo evitar pensar que es un poco tarde, es una llegada tardía, utilitaria y comercial, casi burda, al menos predecible, mecánica, y es muy probable que cuando se implemente en las escuelas haya ya algunos niños que quieran aprender otros temas (que quizás sean los "actuales" dentro de muchos años...).

La excusa clásica es cierta "mejor tarde que nunca", claro, lo acepto, pero también hay que revisar lo que hacemos, ¿siempre tarde? escuchar una y otra vez a la moda, al mercado y a los empresarios en urgencias por tener YA trabajadores para producir, ir entonces ahí corriendo a cambiar los planes de estudio, y promoverlos con eslogans como "la carrera del futuro", y otros menos dignos...bien, eso quizás puede ser "útil" para zafar y seguir alguna que otra zanahoria, lo entiendo y es comprensible, pero no es ninguna novedad, es lo obvio que viene sucediendo hace años, y valdría la pena entonces hacer una reflexión nueva.

¿Cuál sería una novedad? Una novedad sería escuchar, y preguntar, permitir a cada uno decir qué quiere aprender.. Alguien dirá "no se puede hacer una clase diferente para cada persona", claro, pero quizás eso no sea necesario!, el punto es que no podemos anticipar las respuestas!, hay que preguntar, arriesgarse a escuchar qué quiere cada uno; ¿Puede un plan incluir preguntas? ¿Qué hace después el docente con las respuestas? lo que sea que haga en ese momento y lugar va a ser mejor que cualquier plan fijo, confiar, porque "decidir de antemano" es, además de imposible, un miedo sin fundamento, si hoy la programación es declarada central e importante, implica que alguna vez no lo fue, como es probable que mañana ya no lo sea. La actitud de proponer a todos (y a veces obligar) a estudiar lo que hoy es "lo importante" suele ser la misma actitud que lo despreció cuando era innovación, excluir lo que hoy "no es importante" es quizás ir en contra de lo que puede ser importante mañana. Hacer preguntas no es propiciar cosas que actualmente no son útiles, sino simplemente admitirlas, darles un espacio, aunque la función de esto fuera la de fomentar la convivencia, o la de ayudar a pensar, sería ya suficiente provecho.

Hay propuestas que consisten en procurar que Lionel Messi apruebe historia, geografía y contabilidad, o que Einstein no falte a ninguna práctica de fútbol, y algunos le llaman a eso igualdad.


Un par de referencias para profundizar sobre este tema:
  • Un artículo de 1939 pero muy actual, 'The usefulness of useless knowledge' Abraham Flexner (en inglés) la persona que contrató a Kurt Gödel para trabajar en Princeton se dice lo hizo inspirado en la lectura de este artículo.
  • El concepto de Exaptación, en la teoría de la evolución se identifica un fenómeno que consiste en la reutilización de una característica que durante la evolución tenía un efecto neutro o irrelevante en apariencias pero que luego surge bajo una nueva e "inesperada" funcionalidad. Si ya conocemos esa característica de la evolución, ¿Vamos a seguir simulando sorpresa?

30 de noviembre de 2013

Tildar


Aporte a la etimología de la palabra Tildar en computación

Esta palabra se usa para indicar que algo "no responde", en Argentina es usual decir "se tildó", "se tilda", "se tildaba", "está tildado", entre otros sinónimos como se cuelga, se congela, se friza, se bloquea, se paraliza, se clava, se traba, etc.. Esto es aplicable a cualquier dispositivo tecnológico cuando no responde (usualmente va combinada con insultos).

¿Qué tiene que ver tilde con computadoras?¿Qué origen puede tener esta conexión? Lo dejo ciertamente como hipótesis, pero es posible que provenga de los flippers, que usaban la palabra Tilt en su pantalla (Tilt en inglés se traduce como Inclinar), esto aparecía para indicar que el jugador había "inclinado" la máquina para hacer trampa y normalmente, además de esta indicación, la máquina daba por terminado el turno o el juego entero. El flipper dejaba de responder intencionalmente, no como una falla, sino que era parte de su funcionamiento para prevenir las trampas, es decir una de sus funciones posibles era dejar de funcionar, el origen de la palabra estaría entonces en esa asociación "Tilt equivale a dejar de responder".

Este es un posible ejemplo de los extraños caminos que toma el lenguaje para evolucionar, y de cómo muchas teorías generales sobre el "origen de las palabras" sean más bien estudios históricos antes que racionales ¿Cómo se puede relacionar la palabra inclinar, los acentos ortográficos y que algo deje de responder? Obviamente mediante un flipper.

La palabra tilde se usa además para nombrar al acento ortográfico: es decir, la pequeña línea que va sobre una vocal (por ejemplo en la 'o' de canción), también se le llama tilde a otros garabatos que van sobre las letras, como el de la eñe. El verbo tildar, en este contexto es la acción de dibujar el acento. 


Nota: tilde no lleva tilde, tiene acento prosódico (palabra que sí lleva tilde).


Más sobre flippers o pinballs

http://es.wikipedia.org/wiki/Flipper_(juego)
http://en.wikipedia.org/wiki/Slam_Tilt
http://www.retrogames.cl/flippers.html

16 de septiembre de 2013

Fehaciente

fehaciente.

1. adj. Que hace fe, fidedigno.



¿Esto está en Internet?


Esta frase está ahora en tu mente. Antes estuvo en la memoria de una computadora, pero ¿De dónde provino? La información que percibimos nos lleva a diferentes pensamientos, conclusiones y acciones, la lectura de una noticia, un email, modifican nuestro accionar, siempre y cuando confiemos en la realidad de esa información ¿Es un mensaje creíble? ¿Es spam? ¿El autor del mensaje es quien dice ser? ¿El medio de comunicación es quien dice ser? ¿Cómo saber si "esto" es Internet y no son datos preparados para que parezca Internet? ¿Podríamos diferenciar algo simulado de algo real?

Supongamos que hubiera métodos para distinguir esa simulación ¿Cuánto tiempo estaríamos dispuestos a dedicarle al chequeo? ¿Cada vez que entramos a Internet verificamos que sea realmente Internet? No, al menos no conscientemente, y en principio existe la posibilidad de ser engañados, mediante pequeñas intervenciones a las conexiones la comunicación podría ser manipulada, justamente aprovechando la confianza que está puesta en los datos, es como si de repente viéramos mucha gente corriendo hacia algún lugar, seguramente nos preguntaríamos qué les pasa, pero si quienes corren fueran personas de nuestra confianza nos veríamos tentados a seguirlos, aún sin esperar averiguar adonde van, y aquí yace una interesante y peligrosa posibilidad de ser manipulados, es la reutilización de nuestra confianza que fue puesta en algo que creemos conocer pero que puede ser redireccionada hacia otra cosa, sin que notemos diferencia.


¿Dónde está Internet?


Internet está distribuida en diferentes computadoras, pero para el caso no importa, ya que a su efecto lo percibimos desde pocos lugares, de hecho podríamos encontrar Internet siempre en el mismo lugar (sea un mismo monitor, teléfono, etc..) encontramos a Internet mirando ese mismo pedazo de material que va cambiando de brillos y colores. Es mucho más fácil simular un "sitio web" que un "lugar físico", de más está decir que no hay que confundir ni asemejar un lugar físico a un sitio de Internet porque esto no es un lugar, los lugares físicos tienen mucha más inercia, están compuestos de miles de millones de átomos, donde cada uno tiene además su complejidad, un lugar físico se puede reformar para parecerse a otro lugar, sea una casa o una zona de la ciudad (tal cual se hace en un estudio de cine, al mejor estilo Truman Show) pero es extremadamente difícil hacerlo, no es en absoluto práctico. Sin embargo es relativamente fácil modificar un sitio de Internet al que acostumbramos a entrar, por ejemplo el email, las noticias, o incluso una búsqueda en Google, más aún si el cambio es sólo visible desde unos pocos dispositivos y conexiones que son los que habitualmente utilizamos, que pueden ser sencillamente identificadas como nuestro grupo de acceso, y de hecho lo son, ya sabemos cómo se adaptan las publicidades y páginas al país, a la localidad, al idioma e incluso a nuestros gustos personales, esta identificación hace que los resultados que vemos no sean los mismos que ve el resto del mundo, y no podemos ir a preguntarle al resto si ve lo mismo, lo que percibimos como "Internet" es relativo al punto de conexión, al navegador, y al usuario, y así está pensado, para que lo que vemos sea "relevante" a nuestro contexto, lo cual en teoría tiene mucho sentido, pero todo es doble filo y lo relevante para nuestro contexto podría convertirse en una simulación preparada para nuestro contexto, lo cual es menos agradable y mucho más simple de hacer que remodelar una casa o una ciudad, se podría preparar una "Internet simulada" para una persona o un grupo sin que ellos ni los demás siquiera se enteren, sobretodo si hacen un uso reducido de Internet, es decir si entran siempre a los mismos sitios y no chequean la información, que a veces por la urgencia no hay tiempo de comprobar, eso facilitaría el engaño porque habría menos cosas que cambiar (de hecho el reemplazo de páginas puntuales ya ocurre en la práctica como forma de ciberdelincuencia denominada phishing)

De similar manera se podría "simular" Internet y generar así una percepción distorsionada de la "realidad"(digital), que a veces se toma como un eco de sucesos reales , lo cual podría no ser así. Esto se volvería especialmente grave si el grupo de personas engañadas, sujetos al simulacro, estuvieran en un lugar de poder, por ejemplo si los engañados son políticos, policías, etc.. ¿Pueden ellos tomar decisiones confiando en lo que les dicen sus computadoras?


¿Qué podríamos hacer para saber si esto es "realmente" Internet?


Este problema no tiene solución general, ni siquiera afuera de Internet, es decir, no hay manera cierta de descifrar si algo es real o no, sabemos que el sol existe porque la mayoría de la humanidad y sus instrumentos están de acuerdo, y si alguno lo negara, antes de dudar del sol, dudaríamos del instrumento o de la persona, (por no estar de acuerdo podría ser etiquetado incluso de no estar cuerdo), así funciona la estadística y en un punto la ciencia, son formas del conocimiento, es mediante una especie de democracia que sabemos qué cosa es real y cual no. Por tanto en el caso de Internet nos quedaría preguntarles a otros, ¿Están viendo lo mismo que yo? y cuantas más personas estén de acuerdo, pensaremos que es más "real", un acuerdo estadístico, por convención, en el mismo sentido que lo tenemos sobre el sol. Esto sin embargo no asegura nada; y por dar un ejemplo, Douglas Hofstadter investigador y escritor, al ver en Internet errores sobre su propia biografía intentó editarlos, pero como alguna mayoría pensó que sus ediciones estaban mal, las "corrigieron", esto lo comenta en una entrevista :

Hofstadter: -"El artículo de Wikipedia sobre mí contiene inexactitudes y eso me deprime"
Periodista: -"Entonces podes arreglarlo"
Hofstadter: -"Al día siguiente alguien lo va a volver a poner como estaba"

(Fuente: entrevista de Deborah Solomon para NYT en 2007)

Aún teniendo en cuenta este tipo de problemas, la decisión por mayorías es algo que se hace,(y en este caso a raíz de ese reportaje se podría llegar a una mejor solución, pero no todos los ciudadanos podrían tener una entrevista para reivindicarse...), como fuere éste es el método que tenemos, observar la cantidad y la diversidad de los datos, poder consultar a otras personas y otras fuentes, es central, si en cambio le falta diversidad a los datos podríamos sospechar que tienen una sola fuente, la variabilidad aquí en lugar de ser una imprecisión es una pista que nos permite sospechar de una fuente independiente y no comandada por alguna intención simple, única y centralizada (en nuestro análisis sería la intención detrás del simulacro), pero no podemos estar seguros, la cantidad y la diversidad a lo sumo pueden tomarse como pistas de realidad, así como la escasez y la no variabilidad de un dato dan sospecha de un engaño, podría no serlo.

La desconfianza, es siempre provisoria, parece apenas un camino que suele llevarnos a confiar en otra cosa, como dijimos, usualmente confiamos en la realidad de algo cuando podemos compartir la visión con otros, cuando otros también lo ven, cuando lo que percibimos está matizado desde muchos lugares, con diferentes puntos de vista y en diferentes formas, algo luce real cuando es "demasiado complejo" para una simulación, demasiado complejo para ser falso, insisto sin embargo en que no podemos estar seguros ¿Cuándo es algo demasiado complejo para ser falso? algo bien podría ser "lo suficientemente complejo" para que parezca real, y sería suficiente para que no podamos detectar diferencias, alcanzaría para engañarnos, y si detrás de algo hubiera una intención compleja, podría pasar como realidad ¿Internet dificulta entonces convenir sobre la realidad? No, porque tampoco existía ese acuerdo antes de Internet, no hay que sorprenderse porque no hay aquí novedad, basta leer a los físicos, a los poetas y a los filósofos que hace tiempo nos cuentan que nunca estuvimos seguros de la realidad, que no hemos llegado a acuerdos definitivos, y que posiblemente nunca los vamos a tener, intentando comprobarla, se nos escapa, y ante cada respuesta nueva nos llena de preguntas que nos piden lo mismo: confiar.


"El simulacro no es lo que oculta la verdad, es la verdad la que oculta que no hay verdad, el simulacro es verdadero" -Jean Baudrillard


8 de julio de 2013

FTP desde batch en windows

Supongamos que el archivo file.txt, se quiere bajar desde el servidor ftp://direccion_ftp.com

Para eso se puede guardar una lista de los comandos ftp necesarios en un archivo, por ejemplo:

creamos cmd.ftp conteniendo
open direccion_ftp.com
userFtp
passFtp
get file.txt
quit
Obviamente reemplazando la dirección, usuario, password y archivo por los que correspondan.
(Notar que la URL se escribe directamente, sin especificar el protocolo ftp)

Ahora creamos un archivo .bat para ejecutar esos comandos desde el cliente ftp, por ejemplo :

creamos download.bat conteniendo
ftp -s:cmd.ftp
Listo, probar!
C:\path>download.bat
Salida

C:\path>ftp -s:cmd.ftp
ftp> open direccion_ftp.com
Conectado a direccion_ftp.com.
220 "Bienvenido al servidor de FTP"
Usuario (direccion_ftp.com:(none)):
331 Please specify the password.

230 Login successful.
ftp> get file.txt
200 PORT command successful. Consider using PASV.
150 Opening BINARY mode data connection for file.txt (1024 bytes).
226 Transfer complete.
ftp: 1024 bytes recibidos en 0,02 segundos 77,31 a KB/s.
ftp> quit
221 Goodbye.

Cuidado: el archvo cmd.ftp va a contener usuario y password del ftp, y lo podría ver cualquiera, cosa que no suele ser buena idea.



26 de junio de 2013

¿ Cuánto consume un teléfono ?


Un teléfono solo, no sirve para comunicarse.

Sólamente puede comunicarse con otros, si es que existen otros y están encendidos; sino no.

Usualmente el consumo eléctrico se refiere a la medida de potencia, es decir, cuanta energía por segundo utiliza. Para saber esto, no alcanza con tener en cuenta un teléfono aislado, porque la existencia de los demás teléfonos es obligatoria (además del sistema de antenas, transmisores, etc.). Por lo tanto para que un teléfono cualquiera pueda comunicarse con otro cualquiera debe estar funcionando toda la red.

No es sencillo saber qué beneficios traen, pero sí podemos saber que la potencia que le exigimos al mundo para tener un celular es de miles de millones de Watts.

24 de febrero de 2013

Peaceful General Public License

El Soft es Libre... ¿Y Nosotros?

Las ventajas del software libre están a la vista, las desventajas..no tanto, tenemos mucho por pensar aún; en 2005 había preparado una reflexión sobre este tema en una página de geocities (que no existe más)... fue motivada por una charla en la lista de lugro ( un grupo muy amable dicho sea de paso ), el tema planteado era "el soft es libre..¿y nosotros?", pasaron varios años de esa pregunta pero creo que sigue siendo un tema actual, revivo aquí entonces algunas de esas palabras pensando que todavía tienen algo que decir.


Soft Libre...de Intención?

Libertad sin intención suena algo contradictorio, libre implica expresar intenciones, si se separa el software de las intenciones, no hay más libertad humana ahí, es sólo la libertad para el software en sí mismo. La licencia GPL ofrece libertades  y establece obligaciones. ¿Qué libertades ofrece y cuales son las obligaciones? ¿A quién?
Las "libertades" que ofrece son la de usar/estudiar/modificar/distribuir el software, y las obligaciones que implica, son justamente las que posibilitan esas libertades, es decir, el programador que quiera usar esa licencia o librerías que la usen, está obligado a entregar el código fuente de su algoritmo, es decir la receta de su programa, facilitando así la posibilidad de estudiar el funcionamiento y modificarlo. Esas obligaciones reflejan entonces la más profunda de las motivaciones de la licencia:   propagarse.

Algunos pensamos que la libertad es un concepto elevado, y no alcanzable mediante licencias ni leyes, porque atiende a una idea muy general e inaprensible, por eso a la palabra libertad se la puede (y suele) utilizar de las maneras más diversas: sea para mejorar la vida de las personas, como para justificar guerras, para hacer propagandas de gaseosas light, etc... Defenderla como palabra en sí, sin aclaraciones ni restricciones es defender a todos sus usos abusos, al menos habría que dejar claro cuál libertad se quiere, para quién o qué , hay que notar lo obvio, es una definición subjetiva, y que como otras palabras, ya ha sido adaptada para propiciar obras bellas y crueldades temibles. Es una pena que se le haya puesto ese nombre, pero no creo que sea casual, el software hoy en día es casi un ser vivo en simbiosis con nosotros, y es comprensible que esté yendo hacia una libertad.

En las obras bellas no suelen usarse las armas, y si la GPL no permite cerrar el código con el fin de auto-sostenerse y propagarse ¿Porque no resignar entonces otra libertad con algún fin más humano? ¿Valorar la vida?.

Como el Software Libre no le permite al programador decidir a quién entregar su código fuente una vez liberado, quien utilice la licencia GPL está obligado a perder el control sobre dónde, quién y para qué se utilizará su trabajo, su código fuente, para así dar libertad al software en sí mismo, y supongamos también quizás al usuario.. Se resigna cualquier intención original a cambio de que el código siga siendo abierto.

Podríamos preguntarnos, si el software puede copiarse de todas formas, y la licencia no es más que para declarar intenciones; (porque sabemos que una vez liberado un software, cerrado o abierto, nada se puede hacer con el uso que se le da, incluso un software cerrado podría reutilizarse) aún así, quizás la pregunta es entonces cuáles son esas intenciones nuestras, cuál es nuestra postura en esa declaración, ¿Es para nosotros más importante declarar nuestro apoyo irrestricto a la propagación de un código fuente y auto-sustentar una licencia, que contar nuestras intenciones sobre sustentar la vida y la paz , evitando así "ensuciar" la licencia con cuestiones humanas ?

Así puede ser para unas personas, pero no para otras. Por tanto, ya que hablamos de libertad, llevémosla al terreno de un programador que debe elegir su licencia, y por tanto se puede admitir la diversidad de opciones (cosa que no asegura la libertad pero al menos permite una parte). Lo que podemos proponer es que la GPL sea siempre opcional, y quien no quiera publicar su código tenga siempre la libertad de no publicarlo.
Que cada uno pueda decidir es poner por encima una libertad y un derecho humano a un derecho maquinal, una libertad para bits ( no sé por cuanto tiempo sean más importantes los humanos que las máquinas, pero podemos hacer algo mientras ).
Incluso puede que alguien quiera publicar su código, pero no para cualquier fin, lo cual es un poco paradójico porque al publicar ya dijimos no hay chance de controlar la finalidad del source, sin embargo, aún así se puede declarar una intención, y por ejemplo quien esté interesado en apuntar sus intenciones a la paz, puede publicar con una licencia "Peaceful" GPL en lugar de la GPL.
El software libre es muy importante, tanto como el software privativo. Creo entonces que no debería prohibirse ninguno.
No hay ninguna necesidad de discutir acerca de si hay fines bélicos correctos o incorrectos. Sencillamente hay gente que preferiría usar una PGPL (GPL Pacifica) y puede expresar su intención.

¿Queda claro que: "Por más que pongamos cláusulas, lo pueden igual usar ilegalmente...."? Clarísimo, pero las licencias libres también pueden ser usadas ilegalmente cerrando el código, sin embargo, sus cláusulas siguen ahí! (que obligan a entregar el código fuente)... Esto es porque las cláusulas así como las leyes de un país, no eliminan el delito, sino que representan una postura, una filosofía, un ideal al cual apuntar a que sea parte de la cultura. ¿Cuál es el ideal del software libre, y quién posee esa libertad además del mismo soft? Probablemente hay una comunidad que NO es representada por una GPL o cualquier licencia de soft libre a la que "le da lo mismo" si el código es utilizado para un juego que para matar personas. Y estos comentarios que estoy haciendo son un parche que se sabe poco útil de entrada porque no soluciona el problema, pero su objetivo es otro, es dejar bien clara una postura para invitar a la paz, y no a la indiferencia.

Agregado Pacifista :
"Esta prohibido utilizar el software que cubre esta licencia (source y binario) directa o indirectamente
o como parte de otro software con el objetivo de causar daño a seres humanos, la fabricación de armas o para ser usado en cualquier tipo de aplicaciones bélicas. Al autor de este software No le da lo mismo cualquier aplicación de su trabajo."
Este agregado es para hacer notar que la reutilización del código puede tener la finalidad más insospechada. Y si ya somos lo suficientemente inconscientes como para desarrollar tecnología, podríamos decir al mundo que se puede dar un mal uso, y si se da un mal uso : "No es nuestra intención", que si le dan un mal uso lo tendrán que hacer ilegal, para no ser cómplices porque lo rechazamos desde el origen mismo.
Que por otro lado, es quizás todo lo que podemos hacer...

Es adjuntar una propaganda pacífica, humana. Para que, cuando se reproduce el software, ya que está, se reproduzcan juntas.

Y ¿Qué pasa si se necesitan desarrollar armas para defenderse de "malos", extraterrestres, meteoritos, y otros etcéteras? En tal caso se puede usar soft con otra licencia, o se le puede consultar al autor si lo permite, o cambiar la licencia, o usarlo ilegalmente ¿ o qué tal joderse ? La paz no es gratis.

"Lo preocupante no es la perversidad de los malvados, sino la indiferencia de los buenos" Martin Luther King

5 de febrero de 2013

Lenguajes

Lo que puede hacer una computadora ¿ depende o no del lenguaje de programación ?
Las dos cosas a la vez.

Para explicar esta idea pongamos una analogía; pensemos qué pasa con la cooperación entre las personas, si depende o no del lenguaje usado (el lenguaje en un sentido general, incluyendo el estilo y el modo, bien podría ser un lenguaje amistoso, formal, ofensivo, etc.. para cualquier idioma), ¿Depende entonces? Vamos a un ejemplo donde el lenguaje sí es importante, para esto basta ir por la calle y pedir a varias personas mediante insultos que nos digan la hora, y comparar los resultados haciendo similares pedidos de maneras amables y respetuosas. Por otro lado, un ejemplo donde no importa el lenguaje, sería este otro ¿ Se puede convencer a alguien de crear energía, de hacer viajes en el tiempo, o ir más rápido que la luz.. con algún lenguaje? Esas cosas parecen estar fuera de las posibilidades de nuestro lenguaje, porque habría cosas que están fuera de las posibilidades de nuestra realidad.

En el caso de las computadoras y los lenguajes de programación también hay tareas que, si bien las podemos imaginar, No son realizables mediante ningún número de pasos (por ejemplo no se puede resolver el Halting Problem mediante un algoritmo), otras cosas que son independientes del lenguaje son ciertas operaciones básicas, mínimas; todos los lenguajes coinciden en esos límites teóricos, pero no coinciden en los prácticos; ahí está la dependencia con el lenguaje, en la práctica aparecen diferencias, mientras que en algunos lenguajes es muy simple lograr ciertas funcionalidades, esas mismas se hacen muy complejas en otros, dando un ejemplo básico, algunos microprocesadores son capaces de hacer multiplicaciones con una sola instrucción, y otros no, para multiplicar deben usar una secuencia de sumas, en este caso la misma operación se complica, y esta diferencia de complejidad puede crecer arbitrariamente (me refiero a que puede haber problemas que siendo muy simples en un lenguaje pueden llegar a ser impracticables en otro), por lo tanto cada lenguaje tendrá su performance, su belleza, su efectividad en cierto ámbito (tal cual lo tienen las diferentes formas de pedirle la hora a alguien..).

Lo mínimo que podemos hacer, y lo que seguro no podemos, es común a todos los lenguajes, eso no depende de cual, pero lo que "quizás" podemos hacer, eso sí depende del lenguaje usado, incluso depende de poder encontrar ese lenguaje a usar... ese es el futuro abierto.


Gramática y Semántica

La sintaxis y gramática del lenguaje, es decir las palabras aceptadas por el lenguaje y las reglas para combinarlas, son la parte objetiva del lenguaje, todo lo que compila sin "syntax error", pero bien sabemos que eso no significa que el programa vaya a funcionar como queremos, porque la funcionalidad está normalmente afuera de la gramática, es subjetiva, es el significado de lo que hicimos, llamémosle su semántica. Y si bien la semántica (uso) es otra cosa que la gramática (código fuente), está lograda mediante ella, con lo cual quedan íntimamente enlazadas. Vamos a analogías, si hacemos una comida, mediante una serie de pasos, la comida en sí estará afuera de la receta, aunque la receta sea un camino para lograr esa cena. Y con esa burda comparación volvamos al tema, la gramática y la semántica son inseparables, dependen mutuamente, al destruir una la otra desaparece, se influyen mutuamente, sin embargo Ninguna determina unívocamente a la otra, es decir, hay una libertad que está dada por la multiplicidad de formas de producir "lo mismo" externamente; aún así es usual que se quiera elegir entre ellas: "es sólo gramática" (forma) o "es sólo semántica" (contenido), se suelen hacer estas afirmaciones, supongo por alguna limitación cognitiva que nos hace difícil sostener dos ideas contradictorias en la mente, pero es claramente posible, y posiblemente necesario.

Muchas veces se discute si un lenguaje es mejor que otro, se olvida decir mejor en qué o para qué, por ejemplo no se aclara si en la discusión si se comparan también las librerías disponibles, que ya traen aparejada una semántica, en realidad si se tuviera todo eso en cuenta la discusión se tornaría ridícula, supongamos que alguien tome el buscador google y diga "este buscador ejecuta su código finalmente en computadoras, es decir en instrucciones mínimas de microprocesador, por lo tanto, es ese el lenguaje que 'realmente' hace las búsquedas", otra persona al mismo nivel de miopía produce un texto como "hice un script en el lenguaje X que permite usar múltiples buscadores automáticamente, y poner resultados en una lista, por lo tanto X es el mejor lenguaje", en el primer caso vemos que se está omitiendo que el código ejecutable en instrucciones nunca pudo haber sido escrito así directamente por seres humanos, la complejidad requiere para nosotros de las capas de abstracción, no podemos manejarla en crudo, por lo tanto no puede hablarse de que las instrucciones compiladas y después desensambladas sean un lenguaje en sí, (salvo que asignemos el mérito del Quijote ya no al escritor Cervantes, sino a la tinta en sí, porque "de eso está hecho el Quijote"..), por otro lado, en el segundo caso del lenguaje X, se pierde de vista que está haciendo uso del trabajo de muchas personas, y mucho tiempo de evolución, y en definitiva otros lenguajes, y no debería asignarse todo el mérito, porque no lo tiene, muchas veces usan directamente librerías escritas en otros lenguajes, o ideas que no podrían estar ahí, sin los demás lenguajes..

Sería lindo logremos esa humildad, admiración, que muchos pudiéramos pensar sobre este tema como Newton pensó alguna vez sobre sus logros : "Si he podido ver más allá que otros es porque me he apoyado en hombros de gigantes", pero ese tipo de reflexión parece poco popular, casi prohibida. Como suele ocurrir, por razones que no voy a exponer acá, cada vez que aparece una visión o un lenguaje nuevo, hay una tendencia a buscarle ventajas y desventajas, para tratar de eliminar o imponer.

Ahora, pensando en la semántica que hoy existe, y me refiero a los logros computacionales que conocemos, se puede ver que siempre se le puede asignar a esas funciones un nombre, y que estas sean a la vez palabras de otro lenguaje de jerarquía superior, etc, parir una nueva gramática es producto puro de la evolución (como los paradigmas funcional, estructurado, de objetos..), y no es obvio que alguna sea más poderosa "en sí", porque sólo podemos evaluarla mediante la semántica, por otro lado, comparar sólo la sintaxis no aporta mucho. Imaginemos (y no hay que imaginar mucho) que todos los desarrollos de software del mundo, pudieran ser accedidos mediante un hipotético lenguaje Z, y a lo sumo luego de una posible ceremonia de compilación se puedan ejecutar sendos servicios del más alto nivel alcanzado hasta el momento, generando así nuevos desarrollos de aún más alto nivel, Z1, Z2, Z3.., Z++, Z#,...

Obviamente la semántica alcanzada hoy es dependiente de una gramática subyacente, no arbitraria pero sí contingente, es decir hay multiplicidad de opciones para alcanzarla, el secreto es cierto "umbral" de efectividad, que la hace invisible, cuando una funcionalidad logra cierta efectividad aceptable ya no es tan dependiente de la forma, es decir lo que el software hace (semántica) si lo hace eficientemente se libera en mucho de las contingencias gramaticales del lenguaje.

Ya hay servicios a este nivel como para armar lenguajes, procesos y funcionalidades, por un lado todos los frameworks, y lenguajes, por otro los servicios webs, e incluso páginas como ifttt.

Ejemplo en lenguaje Z.

Recipe getRecipe( String searchString )
{
    Google google=Google.getInstance();
    Internet inet=Internet.getInstance();

    return inet.google.find(searchString);
}
int main()
{
    Recipe recipe = getRecipe(" How to time travel "); 
    recipe.follow();

    return 0;
}

El progreso de la semántica siempre va a estar arraigado a muchísimas gramáticas organizadas en capas y con una evolución histórica por detrás, paradójicamente, la visibilidad de esas capas dependerá de que cuán inefectivas sean, es decir, una capa extremadamente efectiva, será por eso mismo extremadamente invisible.

10 de noviembre de 2012

git init

Git es un conocido Sistema de Control de Revisiones Distribuido (DRCS) que permite hacer seguimiento de cambios a los archivos de un proyecto, facilitando además el trabajo en equipo.

Estas son notas preliminares para iniciarse en la terminología git , un panorama para facilitar el camino al que recién se inicia.

Para ejecutar los comandos citados de ejemplo se debe tener git instalado.


Conceptos Básicos

  • Repositorio (alias 'repo')
    Lugar donde se almacena el registro de los cambios en archivos, ¿Todos los cambios? no, sólo se registrarán las modificaciones que ocurrieron entre comandos commit, git almacena todo este registro en una carpeta llamada .git
    Para crear un repositorio local se hace con el comando
    git init
    en la misma carpeta que están los archivos que queremos hacer seguimiento.
    Durante el desarrollo y las pruebas se suele trabajar con esos respositorios locales, que están en la misma carpeta de cada proyecto, pero usualmente hay también algún respositorio remoto para mantener las revisiones en un servidor, lo cual es muy útil para trabajar en equipo y tener backup, ahí se suben los cambios y se puede mantener actualizada la copia local con la del server.

    Todo esto requiere alguna metodología de trabajo para evitar perder datos, por ejemplo sobreescribir el trabajo de otro, tomar una revisión vieja por error, etc.

  • Working Directory / Working Tree
    Es la carpeta donde están todos los archivos de nuestro proyecto. Respecto a git ve básicamente dos tipos de archivos: los que figuran en el repo y se les hace un seguimiento de cambios (tracked) y los que no (untracked) que no se registran. De todas formas esto es dinámico, además hay una instancia intermedia antes de estar registrados en el repo pasan por la "Index/Staging Area".

  • The Index/The Staging Area
    Se refiere a la lista de archivos cuyos cambios se registrarán en el repo durante el próximo commit (independientemente de si previamente figuraban o no en el repo) por ejemplo el comando
    git add archivo.txt
    agrega el archivo.txt a la "Staging Area" es decir lo deja 'preparado', y con el comando
    git commit
    se registra en el repo, ya sea su primer registro o almacenando una nueva revisión de sus cambios.
    git add .  (agrega al Index los archivos en carpeta, modificados y nuevos, sin actualizar los borrados)
    git add -u . (agrega al Index modificados y actualiza borrados, sin agregar los nuevos)
    git add --all . ( agrega todos los cambios al Index, es decir ambas anteriores)
    

  • Commit
    Este es el comando (y concepto) de registrar en el repositorio local la revisión actual de los archivos que estén preparados, es decir, los que están en el Index/Staging Area.
    Para saber qué cambios hubo en la carpeta de trabajo desde el último commit, puede usarse
    git status
    esto informa de los cambios, no sólo en los archivos tracked(que ya figuraban en el repo y tenemos un registro, o de los que estén en el Index listos para commit), sino que justamente nos avisa si por ejemplo aparecieron archivos nuevos en el Working Tree cuyos cambios no están siendo seguidos, para que nos demos cuenta de agregarlos si es necesario.
    Cada commit debe incluir un mensaje que indique el motivo del mismo, por ejemplo "reparado tal problema", "agregada tal función", etc.. además este mensaje queda almacenado en el commit junto al nombre de quien lo hizo. Para listar la historia de commits se usa
    git log
    (y para ver sólo el último commit se puede usar git log -1 ). El nombre de "autor" para los commits se puede especificar globalmente, así no tenemos que escribirlo cada vez en nuestra computadora
    git config --global user.name  "nombre"
    git config --global user.email "nombre@mail.com"
    
    También puede abrirse el archivo de configuración con el editor por defecto
    git config --global --edit
  • y editarlo directamente
    [user]
             name=nombre
             email=nombre@mail.com

  • Staging
    Es la acción de agregar archivos al Index/Staging Area, en otros sistemas la palabra commit suele significar "guardar las diferencias de todos los archivos seguidos" pero en git está la opción/obligación de agregar primero los archivos al Index antes de hacer commit, esto permite commits separados y diferentes para un mismo conjunto de archivos, por ejemplo si se hicieron un par de cambios que no tienen nada que ver entre sí en diferentes archivos, y no se desea hacer un commit general, se pueden hacer varios commit independientes por archivo (e incluso para partes de un mismo archivo).
    Al momento de almacenar los cambios git commit a secas no actualiza todos los archivos del repo, sino sólo los que están en el Index, por lo tanto antes de un commit se deben agregar, por ejemplo, git commit archivo, y si se quieren registrar los cambios de todos los archivos que figuran en el repo, se puede usar el comando git commit -a que primero agrega al Index todos los archivos que ya figuraban en el repositorio (tracked) y después hace el commit. Finalmente si se agregan nuevos archivos al proyecto, y se los desea incluir en el commit, no alcanza con hacer commit -a ya que los que nunca estuvieron en el repositorio se deben agregar mediante add.

  • Branch
    En un proyecto suele haber varias ramas de trabajo, se suelen hacer muchas revisiones hasta que queda funcionando(o alguna parte) de una manera más o menos "estable", en esos momentos se libera una Versión, la cual no debe mezclarse con otras revisiones que se puedan ir haciendo ya sea para agregar funciones, reparar errores, probar nuevas características, etc.. cada una de estas posibles ramificaciones de revisiones sucesivas se llama branch, usualmente hay una rama principal a la que se llama master, que es la que contiene sólo las versiones liberadas "estables" y ninguna revisión en la que se estan haciendo cambios "inestable" (pero todo esto ya depende de la metodología de trabajo adoptada)
    Para crear una rama de trabajo, por ejemplo llamada "ramaTrabajo", se usan los comandos:
    git branch ramaTrabajo
    git checkout ramaTrabajo
    El primer comando crea el nuevo branch, el segundo lo selecciona. Seleccionar el branch con checkout no es una simple cuestión de nombres, detrás cambia todo, por ejemplo si hicimos modificaciones y commits en la ramaTrabajo, y luego volvemos al branch master, todos los archivos cambian al modo que estaban en master, esto permite cambiar el marco de trabajo sin mezclar revisiones. Si intencionalmente deseo mezclar las revisiones lo voy a hacer a través de git de una forma ordenada, por ejemplo si hay un branch "fix" hecho para corregir un problema, cuando ya está listo para ser parte del master puedo escribir.
    git merge fix

  • HEAD
    Es una forma de referir el branch actual, con el que se está trabajando, cuando se hace un commit por defecto se guardan las diferencias respecto a la anterior revisión que corresponda a ese branch.
    Por ejemplo el HEAD de un repositorio local podría apuntar a un branch llamado "develop", mientras el HEAD de otro repositorio podría apuntar a un branch llamado "bug_fix", etc..
    Para ver donde está apuntando el branch actual basta ver el contenido del archivo HEAD, esto se puede hacer, estando en la carpeta de trabajo.

    En Linux:
    cat .git/HEAD
    En Windows:
    type .git\HEAD

  • origin
    Es la forma de referir al repo del servidor remoto desde el cual se actualizado el repo local (pull) o hacia el cual se guardan los cambios (push).
    git remote add origin direccion_web_del_repo
    Ejemplo:
    git remote add origin https://github.com/nombreUsuario/proyecto.git

  • SHA1
    Esto está relacionado a git sólo de manera indirecta, SHA (Secure Hash Algorithm) es la forma que usa git para calcular una "firma" del archivo, identificarlo y detectar así si hubo modificaciones

  • Para finalizar diagrama simplificado de estos conceptos (fuente:Wikipedia)



26 de junio de 2012

Python primera prensada


En cualquier orden, esta es una primera impresión

Voy a tomar como referencia el lenguaje C por conocerlo, pero no es una comparativa. Dejando de lado que usualmente Python se ejecuta bajo un intérprete, lo primero que me llamó la atención es que las funciones en lugar de definirse entre llaves {}, requieren indentación, (sí, requieren ), supongo esto es para que la legibilidad del código no quede del todo librada al programador y sea parte de la sintaxis, otro detalle inmediato es que no se usa punto y coma al final de las líneas, y que los comentarios de código se escriben anteponiendo #. Aunque incompatibles con C, son lindas cosas, hasta ahí particularidades que no aportan mayor ventaja, veamos algo más, un hola mundo.

Hello World
  • En C
    // Comentario
     int main(void)  
     {  
         printf("hola mundo" );  
         return 0;  
     }   
    
  • En Python
    # Comentario  
    print ("hola mundo") 
    
En ese ejemplo Python luce más simple, pero para ser justos debería compararse con un hola mundo definido en una función main, que esto revelar más detalles del lenguaje, y hecho así ya no parece simple.

Python main
  • #Definiendo main como función
    def main():
        print ('hola mundo')      #1
    if __name__ == '__main__':    #2
        main() 
    
    #1: Notar la indentación (viene a ser equivalente a las llaves de C)
    #2: Aquí el hecho de no tener indentación da por terminada la def anterior
Repetir Strings
  • #Aprovecho a mencionar una singular forma de repetir strings
    print("hola mundo " * 5)
    
    hola mundo hola mundo hola mundo hola mundo hola mundo
Dicho sea de paso, estos ejemplos son para Python 3.x, aclaro esto porque a partir de la versión 3.x print usa paréntesis, es una función, por lo tanto el "hola mundo" de la versión 2.x (sin paréntesis) tan simple que parece, es incompatible.

Python 2.x
  • print "hola mundo"
Python 3.x
  • print ("hola mundo")

Esto evidentemente puede ocacionar problemas con código 'viejo', pero como salvedad digamos que "no es tan importante de donde viene, sino adonde va", y creo que es una mejora uniformizar el llamado a funciones.
Otra cosa, para poder usar ciertos caracteres (por ejemplo tildes) en los comentarios se debe aclarar primero la codificación que se va a usar en el archivo, por ejemplo:
  • #coding: latin-1

Entorno de Desarrollo Integrado (IDE)

Por suerte conseguir una IDE funcional fue relativamente rápido: pyDev.org  (basada en eclipse  que además tiene una versión stand-alone Aptana  y por lo visto funcionan ok).
Hay también un plugin para Netbeans para los que nos gusta esa IDE.

List Comprehension

Esto me gusta, al menos es algo útil, varios lenguajes traen esta característica o alguna similar, las "listas por comprensión" son una forma de procesar y generar listas. A la lista se ingresan, filtran y extraen datos de una forma directa, especificando el qué y sin los detalles de cómo.
Esto podría pensarse en términos más generales como el avance de la abstracción en los lenguajes, (pensemos que hay microcontroladores que ni siquiera tienen una instrucción de multiplicar, y las multiplicaciones se hacen mediante desplazamientos de bits y/o sumas sucesivas), pero todo eso es invisible para el lenguaje, y es solucionado por el compilador, por lo tanto en ese caso básico ya se puede ver cómo un "algoritmo oculto" (lenguaje abstracto) resuelve el cómo especificando sólamente el qué.
Como siempre toda abstracción exige que se pierdan ciertos detalles, y el control sobre esos detalles, y aunque esto aparentemente limita ciertas posibilidades a bajo nivel permitite facilitar otras de mayor nivel que en definitiva son más complejas y tienen un mayor alcance.
Aquí algunos ejemplos que se explican a sí mismos con los resultados
  • #Imprime el elemento 3 
    #Va a imprimir la D (ya que empieza en indice=0 tal como los array de C)
    
    lista = ['A', 'B', 'C', 'D', 'E']
    print( lista[3] )
    
    D
  • #coding: latin-1
    #Ahora vamos a usar 'comprehension' para extraer datos
    #Se obtienen, modifican e imprimen todos los elementos de la lista
    #multiplicando cada valor por 2
    #Observar que la palabra elemento sólo se usa para referenciar el item
    #puede usarse cualquier nombre de variable
    #(abajo está la misma operación mediante for (sin comprehension) )
    listaNumeros = [100, 200, 300, 400, 500] 
    listaCompre= [2*elemento for elemento in listaNumeros]
    print(listaCompre)
    
    listaClasic = []
    for valor in listaNumeros:
        listaClasic.append(2*valor)
        
    print(listaClasic)
    
    [200, 400, 600, 800, 1000]
  • #coding: latin-1
    #Hacemos un poco más complejo el comprehension agregando unos if's
    #Para modificar y seleccionar algunos items de la lista
    #(Notar que la condición la chequea antes de hacer la operación)
    listaNumeros = [1, 2, 3, 4, 5] 
    listaSelecta =[10*valor for valor in listaNumeros if valor>=3]
    print(listaSelecta)
    
    listaDos=['hola', 'cómo', 'va']
    listaFiltrada = [valor for valor in listaDos if valor!='hola']
    print(listaFiltrada)
    
    [30, 40, 50]
    ['cómo', 'va']
Suficiente para una primera impresión

18 de mayo de 2012

Configuration Words en PIC18F26J50


Las Flash Configuration Words (FCW) son cuatro (de 16 bits cada una), y están almacenadas al final de la memoria FLASH de programa, ocupando las últimas 8 direcciones de la FLASH (hay dos direcciones asignadas para cada Configuration Word). Si el micro tiene 64Kbytes de FLASH (desde la dirección 0x0000 hasta 0xFFFF) entonces las Configuration Words van a ocupar desde la dirección 0xFFF8 hasta la 0xFFFF.
En RESET estas Words se copian automáticamente en RAM, en registros para configuración, mapeados desde la dirección 0x300000 hasta la 0x300007, se los puede leer pero no escribir, incluso son esos (los de RAM) los valores que usa el micro para su configuración (si los valores en FLASH fueran cambiados en Runtime por ejemplo en una self-write, ese cambio no tendría efecto hasta que no suceda un RESET y la consiguiente copia en RAM)
  • CONFIG1 0x300000 CONFIG1L 0x300001 CONFIG1H
  • CONFIG2 0x300002 CONFIG2L 0x300003 CONFIG2H
  • CONFIG3 0x300004 CONFIG3L 0x300005 CONFIG3H
  • CONFIG4 0x300006 CONFIG4L 0x300007 CONFIG4H

El seteo de FCW conviene que figure en el source del proyecto para que contenga la configuración de acuerdo a su hardware y no sea necesario almacenar esa información aparte.

Para especificar esta información de configuración en el source se utilizan directivas que son diferentes (según el compilador)

    Para el C18 luce de esta manera
       #pragma config CPUDIV = NOCLKDIV
       #pragma config USBDIV = OFF
       #pragma config FOSC = HS
       #pragma config PLLEN = ON
       ...

    Para el CCS es algo así
    (No me gusta este compilador porque se sale mucho del estándar de C, pero es una opinión personal)
       #FUSES NOWDT  
       #FUSES WDT128 
       #FUSES HS  
       #FUSES NODEBUG 
       ...

    Para el HI-TECH PICC18 se parece a esto
    __CONFIG(1, DEBUG_OFF & XINST_OFF & STVREN_ON & PLLDIV_1 );
    __CONFIG(2, IESO_OFF & FCMEN_OFF & LPT1OSC_ON );
    __CONFIG(3, DSWDTPS_8192 & DSWDTEN_OFF & DSBOREN_OFF);
    __CONFIG(4, WPDIS_OFF);

¿Dónde encuentro los nombres de esas constantes?
 
En el compilador HI-TECH los valores de la constantes están en :

C:\Archivos de programa\HI-TECH Software\PICC-18\9.80\docs\18f26j50.html

(para windows en español y versión 9.80)

Se usan con la directiva

#pragma config

(Que es compatible con C18 pero también con la nueva versión de HI-TECH)

Esto es porque Microchip compró la empresa HI-TECH, los compiladores HI-TECH y C18 se fusionaron en un nuevo compilador llamado XC. Por lo que vi de momento el "nuevo" compilador no es más que el HI-TECH con compatibilidad agregada para C18, para nuevos proyectos (hoy 2012) aconsejan usar HI-TECH, ya que los XC van a ser backward compatibles con ese compilador.