diumenge, 4 de gener de 2015

Memory Managment

As I start to write this, it looks like it will be a long post. And it will be in english (I'll tell you the reasons soon enough), wich is by no way a language I use enough to be confident so if I make any mistakes please correct me.

I noted it's been more than 2 years since my last post. I'd promise I won't wait as much for the next one, but it's a promise I can't make.

So, what do I want to talk about? Well, there is this talk given by Jonathan Blow. Yes it's a talk given at mid September and I did watch it within a week of it's release, so why talking about it now? Because I didn't have the inspiration before.

In the video he asked for comments to a email address. I intend to mail him this post, but I fear I am late, as he has already started to implement his ideas but I'd like to open this discussion anyway.

So... I'm going to say it, and I fear anyone knowing what we are talking about will stop when I say the cursed words, close the window, and never return, so I beg you to at least finish this paragraph. Here they go: a garbage collector is not a bad thing, even in games. Are you still here? Good. Now I'm gonna give a little of what you want to hear: the problem is not the garbage collector, the problem is forcing the programmer to use it.

Do I have your attention now? I hope so.

The key is something J.Blow say in it's talk: the problem are "Big Agenda" languages, like "a language without dangling pointers, nor memory leaks" (yes, GC'd languages still have memory leaks, and C# lets you have your dangling pointers, but you get the point). Another thing J.Blow says is he doesn't want tools that solve 100% of the problems, because there are problems that will just be illfitted fot those tools. So my point is... do not force GC, give it as an option.


Memory Primitives

Now I'll start with some pointer stuff. Forget about GC, forget about J.Blow talk. What do I want to have in a language, memory wise? Build-in strong and weak pointers. Build-in as Objective-C, not as C++. C++ pointers are BOILERPLATE. They scream at you, HEY I'M A SHARED POINTER!!! No, I don't want that, I want a little modifier to our old "*", of 1 or 2 characters at most, so I can tell him, hey, I want you to make this pointer reference counted / weak or unique (I belive J.Blow put unique pointers in his language, so this step should not be that hard to do).

I know the n1 critique this proposal will get: ref counting affects performance, it is slower! And it is. But do I care? I'll tell you what affects performance: cache misses. Adding/Substracting from an integer? Negligible. An integer wich is probably stored on the stack or near data you probably just used? Won't be a problem at all. Weak pointers have slightly more performance impact, but let's be honest, if I need smart pointers, I can program them, I just want them to be as transparent as possible, so they don't take up half my line of code because of std::shared_prt that is at least 15 characters longer than it should, and sp won't cut it, because I want the code to be clearer than that.

More Memory Primitives

Last section was an introduction to this one. This is the meat of the post, this is where the fun is, so let's get the ingredients:

  • Strong references.
  • Weak references
  • Allocators
  • A deallocate reference operation (optional... sometimes).
Now I have to prevent you. This features are suggested with the "good" programmer in mind. As Blow said, we want a language centered on good programmers, give them the tools to do their best, not tools so safe the get hard to use.

Now we'll need to add some rules to the language to make this work. First I'll talk about the allocators: they may be Garbage Collected, but they may be not. Allocators are used mainly to allocate. Any surprises here? Well, instead to have a good old "new" operator, we'll add a parameter to wathever alloc function our language uses to provide the allocator if we are creating a "reference" type. This may even be an instance function if we consider Allocators as objects in a OO language.

Then we'll add a deallocate function. It may or may not need the allocator, depending if we are able to store enought information in the reference to find the allocator "fast" enought. An important note is that this deallocate function is not allways mandatory to use, you will see why in the examples section.

Last consideration, what do we do if we have a reference type inside a structure that is allocated behind a reference. My suggestion is that it better be created with the same allocator, but I can find workarrounds to it that work... and maybe we can give some flexibility there, as a chance to shoot yourself to the feet if you are brave enough. It will have to give comprehensive error messages if someone screws up.


So, what is all this about? Will something usefull emerge from this? I say yes, at least for me.

First consider some kinds of Allocators we can provide:

  • Linear allocators. Each time we allocate something it just moves a pointer. Then it has a "reset" operation, wich frees all created memory. We may even have a variant that calls all destructors on reset (slow), or one that works stack-like, marking points on the memory and only erasing to the last mark on reset. Of course you won't need to call deallocate to any object created by those, but you could do for debugging purposes, to see you have everything under control. Would you like to have this IN THE LANGUAGE?
  • Stack allocators. Similar to the previous one, this does force you to call deallocate to reverse order as allocate. Not as fast deallocating as a linear, but equaly fast allocating.
  • Double stack allocator. Now I'm just listing a random "allocators usefull for game developing" list on the internet.
  • A garbage collector allocator. This is the one that will need assistance from the compiler. As long as you don't allocate things within your main loop, you are good. It may also be easier to fine-tune as than Java/C#/Other GCs, as you may know which threads won't need to be paralyzed by a garbage collection, you could even use it to your benefit forcing a GC while you are doing meaningfull work on another thread and your GC is cleaning/defragmenting things, 


No, a language does not need Garbage Collection to succeed. But that does not mean languages should be GC or not GC, we can give the choice to the programmer and let him use it in the right situations. Also, we got some fun things on the way even if we don't make a garbage collector, some of the infraestructure may be usefull to make the programmer's life easier.

dilluns, 26 de novembre de 2012

Una persona, un vot

Em guardo anàlisis personals / opinions sobre els resultats electorals, i em poso a fer números, que és el que m'agrada. Primer, en sec:

          Vots      Total
CiU     1.112.341  30.41%
PSC       523.333  14,31%
ERC       496.292  13,57%
PP        471.197  12,88%
ICV       358.857   9,81%
C's       274.925   7,52%
CUP       126.219   3,45%
PxC        60.142   1,64%
SI         46.608   1,27%
Eb         27.874   0,76%
PACMA      20.777   0,56%
PIRATA.CAT 17.942   0,49%
Altres     35.812   0,97%
En blanc   52.899   1,45%
Nuls       32.232   0,88%
Total   3.657.450

Segon, repartir els escons de la següent manera:

  1. Entren al parlament aquelles formacions que hagin tret, com a mínim, un 1/135 dels vots (0,74%).
  2. Per cada 1/136 de vots sobre el total de les formacions que han entrat, es garanteix un escó.
  3. Els escons que falten per arribar a 135 s'assignen usant el métode del resitu més gran (aquell al que si sobri més vots). NOTA: Si fos per mi, aqui usaria un Vot Únic Transferible.*

          Vots      Total  Escons  Residu  Adicional  Total
CiU     1.112.341  31,80%    43     0,25              31,85%
PSC       523.333  14,96%    20     0,35              14,81%
ERC       496.292  14,18%    19     0,29              14,07%
PP        471.197  13,47%    18     0,32              13,33%
ICV       358.857  10,26%    13     0,95   +1 -> 14   10,37%
C's       274.925   7,86%    10     0,69   +1 -> 11    7,41%
CUP       126.219   3,61%     4     0,91   +1 ->  5    3,71%
PxC        60.142   1,72%     2     0,34               1,48%
SI         46.608   1,33%     1     0,81   +1 ->  2    1,48%
Eb         27.874   0.79%     1     0,07               0,74%
Total   3.497.788           131

Aqui tenim una idea de com quedaria el parlament en formacions si els vots fóssin proporcionals. Entrarien 3 partits (PxC, SI, Eb [exercici a fer, ajuntar Eb amb vots en blanc, jejeje]), CiU perdria 7 escons, ERC i PP també en perdríen mentre que ICV, C's i les CUP en guanyaríen.

* Vot únic transferible: Només hi ha 4 escons que el VUT pugui decidir, però això no és el que importa del sistema, sinó la posibilitat "d'eliminar" el "vot únic". Jo podría votar al partit pirata en primera opció i a ERC a segona, així m'asseguraria que si PIRATA.CAT no entra al parlament, el meu vot al menys serveix per alguna cosa. Això per mi, i altres que no volen tirar el seu vot pot canviar moltes tendències.

dilluns, 22 d’octubre de 2012

Vot electrònic (I)

IMPORTANT: L'algoritme aquí explicat crec que no va bé. De fet, crec que el vot no és secret, o com a mínim no ho és si el que emet la papereta i el que la reb són el mateix. Com que en el cas d'un gobern, crec que seríen el mateix o tindríen incentius per "conxorxar-se", no me'n fiaría massa. Si es vol fer vot electrònic, es pot fer pseudo-presencial: vas a l'ajuntament/ambaixada/consolat més proper i allà tenen una pila de sobres tancats amb contrasenyes "úniques", tu agafes un sobre a canvi del DNI que te'l registren a la base de dades per no "repetir-te" i fas servir aquesta contrasenya per votar per internet. Fàcil, senzill, tothom ho pot entendre, i es pot implementar sense masses dificultats.

EDIT II: Crec que he trobat una manera de fer que això funcioni, però la revisaré una mica abans de publicar-la.

Fa molt de temps que no publico res, i sento haver de fer una entrada técnica i poc "agraïda", però em vui apuntar el següent algorisme.

Primer les referències:

  author    = {David Chaum},
  title     = {Security Without Identification: Transaction Systems to
               Make Big Brother Obsolete},
  journal   = {Commun. ACM},
  volume    = {28},
  number    = {10},
  year      = {1985},
  pages     = {1030-1044},
  ee        = {http://doi.acm.org/10.1145/4372.4373},
  bibsource = {DBLP, http://dblp.uni-trier.de}

BibTex == lol

I també els apunts del DEIC que baixen i pugen i mai se sap si es mantindràn per gaire temps:

De què es tracta? De votar per internet.
Queda pendent fer una implementació de la democràcia líquida. Es pot fer. I el vot és secret. Bàsicament és ampliant la mateixa idea.

La inspiració bé d'un dia de classe, a Seguretat Computacional, on ens van explicar un algoritme per fer transaccions (de $) sense que el banc sapigués qui les feia. Com és que no he sentit a parlar d'això? Doncs per que funcionava tant bé que blanquejar diners seria perillosament fàcil, així que no s'usa. Aquí crec que no tenim el mateix problema.

Què necessitem? Un algoritme que compleixi nosequina propietat (distributiva, diria). El cas és que RSA la compleix, així que no ens hi ficarem gaire més, ja que podem fer servir el DNIe.

-1. La propietat distributiva és que Ei(x)*Ei(y) == Ei(x * y) && Di(x) * Di(y) == Di(x * y), on Ei(x) és xifrar "x" amb la clau pública de "I" i Di(x) amb la clau privada (signar).
0. Tenim al ciutadà (A) i el parlament (B)
1. El ciutadà tria un nombre aleatòri de 128 bits, que anomenarem "m".
2. El ciutadà tria un segon nombre aleatòri, el "factor de ceguesa" "k".
3. El ciutadà calcula mEb(k). Eb(k) == "k" xifrat amb la clau pública del parlament. mEb(k) == m * Eb(k).
4. El ciutadà s'identifica amb el DNIe al parlament i li envia mEb(k).
5. El parlament signa mEb(k), obtenint Db(mEb(k)). Fem una mica de matex amb la propietat distributiva: Db(m * Eb(k)) == Db(m) * Db(Eb(k)) == Db(m) * k == kDb(m)
6. El parlament li retorna al ciutadà kDb(m). S'anota que ja li ha enviat la "butlleta" a aquest ciutadà per no enviar-li una altra.
7. El ciutadà obtè Db(m) gràcies a Db(m) == kDb(m) / k
8. En un moment diferent, el ciutadà envia al parlament el seu vot juntament amb Db(m) i "m". El parlament comprova que la firma és correcte i accepta el vot si "m" no ha estat utilitzat prèviament.

Amb això tenim que el parlament entre els passos 4 i 6 el parlament no pot obtenir "m" i, per tant, no sap què firma i, si el pas 8 es fa amb prou diferència de temps, no es pot lligar el ciutadà amb el seu vot.
Per a la gent que no sàpiguen criptografía, però si que tinguin una idea de mates, crec que amb els següents apunts breus ho podràn copsar tot (en cas contrari, comentaris i responc):

Les funcions criptogràfiques són 2: Eb(x) i Db(x); la gràcia està en que TOTHOM pot realitzar Eb(x) però només "B" pot fer Db(x). També tenen la particularitat de que Eb(Db(x)) == Db(Eb(x)) == x.
En RSA (algorisme més utilitzat) explicat de forma ràpida: tens 3 números: "d", "e" i "N". "e" i "N" es fan públics, aleshores:
Eb(x) = x ^ e (mod N)
Db(x) = x ^ d (mod N)
Per a que funcioni, d = e (mod phi(N)), diria; però és igual...

P.S.: No me'n recordava. El nombre "m" és de 128 bits per "evitar" que es repeteixi. He fet càlculs ràpids seguint la paradoxa de l'aniversari i m'ha donat que les probabilitats a España (47M de persones, menys de 2^26) 2 persones triin el mateix nombre és de 2^(-120), que seria de 1 entre un nombre de 37 xifres. Difícil.

P.P.S.: Ja li he trobat un error a l'algoritme. Aquesta tarda reviso els apunts, que he de tornar al curro.

P.P.P.S.: No, l'algoritme és correcte. Em pensava que l'administració podría trobar la "transacció" amb la cual va crear una butlleta un cop veia la butlleta fent un seguit d'operacions matemàtiques i comprovacions, segons els meus càlculs aquestes comprovacions resultaven certes en la "transacció" que va crear la butlleta. Ara bé, resulta que també són certes en totes les transaccions, així que m'he estat rallant 2 dies amb el tema per al final descobrir que tot era correcte. Próximament, democràcia líquida.

dijous, 29 de març de 2012

Raons per Esquirolejar

Bones. Avui 29 de març del 2012, vaga general, he treballat.

I per què, oh esquirol nostre? Doncs ara us ho explico.

Primer de tot, ens hem de posar en precedents, pq pogueu compsar la meva (manca) d'objectivitat en aquests temes.
Com algú sabrà, vaig estudiar a la UAB. Informàtica. Curiosament, la única carrera que seguia el pla Bolonya abans de que aquest s'adoptés per totes les carreres Espanyoles. I a què ve això? Un segon, ara us ho dic.
Com potser haureu sentit a parlar, el pla Bolonya va encendre diverses protestes estudiantils i, curiosament, aquestes protestes van ser poc seguides per les carreres "técniques" i concretament molt poc per la nostra. Jo no vaig anar a cap protesta, ni vaig seguir cap vaga d'estudiants (a mi, el pla Bolonya em sembla una bona idea que, oh sorpresa, no s'ha posat en pràctica correctament, però això és una altre história). Allà ja vaig rebre els (tímits) intents de boicotejar-nos les classes per part de piquets informatius, però afortunadament a la ETSE aquests no rascaven gaire (la majoria de gent preferia estudiar/fer classe que no pas seguir teories conspiranoiques sobre la Caixa intentant prendre el control de la ment dels estudiants).
Què vui dir amb tot això? Que ja vinc cremat de sindicats i co. Us ho dic pq entengueu que intento donar arguments, però que tinc fors prejudicis instal·lats en mi.

En fi, al tema.

No segueixo aquesta vaga, per que és una vaga que pretén ser d'una "lluita de classes" que ja no existeix (i aquí segurament haureu de fer un salt de fé: no crec en la lluita de classes "proletariat vs empresaris" la trobo completament passada) i en realitat és per defensar els "drets" en una altra lluita dels que estan per sobre i jo, estic per sota. Parlo de la lluita dels insiders i els outsiders.

Si no teniu ni idea de què és això, us recomano un bloc, el politikon, força d'esquerres i molt ben documentat (cosa que agraeixo enormement) on en algun lloc (o forces) s'explica molt bé.

Fent-ne un petit resum, es tracta de que en espanya hi ha 2 tipus de treballadors: els insiders (els que són dintre el sistema i gaudeixen de tota la seva protecció i beneficis) i la dels outsiders (gent que té feina precària i no està ben protegida). Són, respectivament alts funcionaris (i alguns mitjans/baixos) i treballadors amb contracte indefinit que porten uns 10 anys o més treballant contra la resta.

Per què entenguem millor de què va, us explico un petit apunt matemàtic. Si nosaltres tenim una població de 100 persones i hi ha 80 llocs de treball, aleshores hi ha 80 persones treballant i 20 a l'atur. Fàcil. Si suposem que mai es "creen" ni "destrueixen" ni persones ni llocs de treball (una simplificació que no em b de gust explicar per què la podem considerar correcta, ho deixo com a exercici al lector) aleshores la pregunta és: quan de temps, de mitjana està una persona a l'atur? La resposta és fàcil: el temps mitjà que una persona està a l'atur és directament proporcional al temps mitjà que una persona està treballant. Això vol dir (seguint l'exemple anterior), que si lo normal és estar 800 dies treballant, vol dir que lo normal és que cada 10 dies algú "perdi" la seva feina, i que en canvi algú altre en trobi. Això vol dir que cada 10 dies algú troba feina, si fem una "cua" ens dóna que des de que la perdem fins que la tornem a trobar, passen 200 dies. Ara bé, si la durada mitjana del treball és de 8.000 dies, la durada mitjana de l'atur és de 2.000!

A quina conclusió arribem? Doncs de que que hi hagi gent que perdi la feina no és del tot dolent, ja que en permet a altra trobar-ne. Un cert "reciclatge" és bo. En aquest sistema, hi ha 2 extrems, i un punt d'equilibri. Els extrems són: massa reciclatge (ningú treballa prou temps com per acumular experiència, i sempre que treballa ho fa en condicions precàries) i massa poc reciclatge (quan es perd la feina, és refotut, ja que costa molt de trobar-ne una altra). Sabeu en quina situació està Espanya, actualment? Als 2 extrems.

Tenim un sistema laboral que crea insiders (gent que està molt de temps en un lloc de treball i no hi ha qui els hi tregui, i impedeixen que altres puguin accedir a llocs similars) i outsiders (gent que està constantment trobant/perdent feina i no aconsegueix entrar a la roda "bona").

I per què no he volgut fer vaga? (ah, el tema principal) Molt senzill. Per què és una vaga per defensar els drets dels insiders. Que si, que la reforma laboral és una merda, hi estic molt d'acord. Que no, que ni tan sols s'acosta una mica a solucionar el problema de la dualitat. Però amb un 20% d'atur, qualsevol canvi és millor que la inacció, i la proposta que han fet els sindicats (me l'he mirada) és suïcida en el sentit de que només fa que defensar els privilegis dels insiders.

I un altre apunt anti-sindicats, i per què em costarà molt fer res que es pugui confondre com a suport en vers a ells:
Amb el tema de les retallades, s'han posat molt i molt durs i molt i molt guerreros i al final sempre han cedit (en una negociació és una obligació cedir, no em queixo de que cedeixin, em queixo de què cedeixen) en els mateixos temes: fotre fora temporals, adjunts, etc... En altres paraules, fotre als outsiders a canvi de mantenir els drets dels insiders. I no ens enganyem, només insiders es poden interessar a afiliar-se a un sindicat, així que és totalment normal  que els sindicats protegeixin els seus afiliats, però que després no vagin de defensor del treballador per que això és mentida. Són defensors de cert tipus de treballador.

I a mi no em representen.

I a mi no m'ajuden.

I per això no penso recolzar-los.

P.S.: Estaré a favor d'una reforma laboral que inclogui el següent: http://uncontratoparaemplearlosatodos.es/
Per posar-ho en paraules ràpides, un sol tipus de contracte, indefinit, amb una clàusula de recisió de derivada "decreixent" però "positiva". Cada dia que passa creix el "finiquito", però creix menys que l'anterior. La idea és que fins als 7 anys la indemnització sigui superior al sistema actual, però que a partir d'aquí amb prou feines pugi, eliminant el concepte d'insiders sobreprotegits i donant a aquells que fan feines curtes una bona indemnització (que són els realment putejats).

dijous, 16 de febrer de 2012

Notes sobre Blender (2.61) i Python (Part I)

Útil per poder fer exportadors:

bpy.context.object #objecte actualment seleccionat

En general, per exportar un mesh, necessitem la següent informació:

  • Vertexos
    • Posició
    • Normals
    • Coordenades de textura
    • Pesos (d'animació)
  • Cares
    • Apuntadors a 3 vertexos
Per poder construir, hem de donar unes quantes voltes a les dades de Blender, ja que no estan en l'ordre que ens agradaria.

|               Objecte                          |
| - data:                                        |
|   *------------------------------------------* |
|   |                   Mesh                   | |
|   +------------------------------------------+ |
|   | - faces: Array de:                       | | 
|   |   *------------------------------------* | | 
|   |   |             MeshFace               | | |
|   |   +------------------------------------+ | |
|   |   | - vertices: Array de 3 o 4 ints    | | |
|   |   |   que indiquen els vertexos        | | |
|   |   |   corresponents                    | | |
|   |   |                                    | | |
|   |   | - material_index: index al material| | |
|   |   |   de la cara.                      | | |
|   |   |                                    | | |
|   |   | - normal: normal a la cara         | | |
|   |   *------------------------------------* | |
|   |                                          | |
|   | - vertices: Array de:                    | |
|   |   *------------------------------------* | |
|   |   |          MeshVertex                | | |
|   |   +------------------------------------+ | |
|   |   | - co: Array de 3 floats indicant   | | |
|   |   |   les coordenades                  | | |
|   |   |                                    | | |
|   |   | - groups: Array de:                | | |
|   |   |   *------------------------------* | | |
|   |   |   |     VertexGroupElement       | | | |
|   |   |   +------------------------------+ | | |
|   |   |   | - weight: pes de l'os        | | | |
|   |   |   |                              | | | |
|   |   |   | - group: index del grup      | | | |
|   |   |   *------------------------------* | | |
|   |   |                                    | | |
|   |   *------------------------------------* | |
|   |                                          | |
|   | - uv_textures: Mapa de                   | |
|   |   *------------------------------------* | |
|   |   |       MeshTextureFaceLayer         | | |
|   |   +------------------------------------+ | |
|   |   | - name                             | | |
|   |   |                                    | | |
|   |   | - data: Array on cada element      | | |
|   |   |   correspon a una cara             | | |
|   |   |   *------------------------------* | | |
|   |   |   |      MeshTextureFace         | | | |
|   |   |   +------------------------------+ | | |
|   |   |   | - uv1: coordenades del 1r    | | | |
|   |   |   |   vertex                     | | | |
|   |   |   |                              | | | |
|   |   |   | - uv2: coordenades del 2n    | | | |
|   |   |   |   vertex                     | | | |
|   |   |   |                              | | | |
|   |   |   | - uv3: coordenades del 3r    | | | |
|   |   |   |   vertex                     | | | |
|   |   |   |                              | | | |
|   |   |   | - uv4: coordenades del 4rt   | | | |
|   |   |   |   vertex                     | | | |
|   |   |   *------------------------------* | | |
|   |   |                                    | | |
|   |   *------------------------------------* | |
|   |                                          | |
|   | - materials: array de materials (dades   | |
|   |   apuntades per separat)                 | |
|   *------------------------------------------* |
|                                                |
| - vertex_groups: Array de:                     |
|   *------------------------------------------* |
|   |            VertexGroup                   | |
|   +------------------------------------------+ |
|   | - name: nom del grup (de l'ós que        | |
|   |   influencia)                            | |
|   *------------------------------------------* |
|                                                |

Ara que ja tenim informació de les malles, per definir el material necessitem:
  • Paràmetres d'especular
  • Paràmetres de paral·lax
  • Alpha blended
  • Textures
    • Nom
    • Tipus

|                  Material                      |
| - specular_intensity                           |
|                                                |
| - specular_hardness: (potència especular)      |
|                                                |
| - texture_slots: Mapa de:                      |
|   *------------------------------------------* |
|   |          MaterialTextureSlot             | |
|   +------------------------------------------+ |
|   | - use_map_alpha: si utilitza l'alpha     | |
|   |                                          | |
|   | - use_map_color_diffuse: textura         | |
|   |   d'albedo (color)                       | |
|   |                                          | |
|   | - use_map_normal: mapa de normals        | |
|   |                                          | |
|   | - use_map_displacement: mapa d'alçades   | |
|   |                                          | |
|   | - texture.image: (la textura ha de tenir | |
|   |   el tipus correcte)                     | |
|   |   *------------------------------------* | |
|   |   |               Image                | | |
|   |   +------------------------------------+ | |
|   |   | - name                             | | |
|   |   |                                    | | |
|   |   | - filepath_raw: fitxer on es       | | |
|   |   |   guarda la imatge                 | | |
|   |   |                                    | | |
|   |   | - save(): guarda la imatge         | | |
|   |   *------------------------------------* | |
|   |                                          | |
|   *------------------------------------------* |
|                                                |

dijous, 9 de febrer de 2012

Per què, oh, per què piratejo ("il·legalment").

Bé, fa cosa d'un any i mig, em vaig comprar un joc, el Fallout 3, a l'Steam (una botiga on-line de jocs). En aquell temps, jo era a Alemanya, d'Erasmus. Entre una cosa i l'altre, no vaig obrir el joc fins fa ben poc i, oh sorpresa, estava en Alemany i no se li podia canviar d'idioma.

Per què? Doncs per què a Alemanya es censuren jocs (sorprenent? Australia és pitjor) per la seva violència. I resulta que la versió "censurada" només està en Alemany (i no són pocs els alemanys que es queixen per que volen una "versió original" ja que no els hi agrada la traducció, encara que estigui igualment censurada). Malgrat és força obvi que no estic a Alemanya, i que no he jugat al joc, ni Valve (l'amo d'Steam), ni Bethesda (editors del Fallout 3) em volen canviar el joc, per un d'igual, sencer.

Així que hi tornem a ser. Creia que Steam havia aconseguit eliminar, en bona part, aquest problema, però ara em trobo, que per jugar bé a un joc que m'he comprat, necessito piratejar-lo. Un altre cop, la versió piratejada és millor que la oficial. I aquesta és la raó, senyors, per que existeix la pirateria. I em toca els nassos enormement que companyies del tamany de Bethesda (no culpo a Valve, en aquest cas, ja que em va ajudar moltíssim amb un problema que vaig tenir amb el Batman: Arkham City) es neguin a veure-ho. Mentre el servei que proporcionin els pirates sigui millor que el servei que ells proporcionen, no tenen res a pelar.

Així que passarà una temporada fins que em torni a plantejar comprar un joc que dugui el nom de Bethesda en alguna banda, if you know what I mean.

dimecres, 8 de febrer de 2012

Anacronismes de lateralitat política.

Aqui apunto la resposta que vaig escriure a un amic meu respecte a la demanda de la meva afirmació de "Parlar d'esquerres i dretes avui dia és un anacronisme."


"Dretes" i "Esquerres" són denominacions difuses que ja poca gent sap què vol dir. En un principi haurien de demarcar diferències econòmiques de l'estil "capitalisme radical" (dretes) o "pseudocomunisme" (esquerres). La veritat és que molta gent associa les dretes a gent franquista, nacionalistes espanyols, i altres conceptes que poc tenen a veure amb el "neoliberalisme", i que en tot cas avui dia són compartits per un partit teòricament d'esquerres com el PSOE.

El resultat és, parlar de dretes i esquerres és simplificar la política a un sol eix, quan la política és una discusió multi-dimensional, on pot existir un tio neo-liberal nacionalista català (CiU), que si tira més cap a independentista té problemes per trobar-se un partit ja que no n'hi ha cap que s'avingui a les seves opinions econòmiques (els partits "independentistes" prioritzen ser "d'esquerres").

L'altre tema, amb el fracàs del comunisme i altres alternatives al capitalisme brut, les esquerres s'han quedat sense discurs, i avui dia es resumeix en "el contrari del que digui la dreta". O bé es construeixen un discurs propi i coherent, o bé desapareixen per manca d'arguments.

I fins aqui el tema principal. Una mica de publicitat.

Per mi, un dels grans encerts del partit pirata català (no, no l'anomenaré "pirates de catalunya" encara que s'hi digui, per que no em dona la gana) i del moviment pirata en general, és la aposta per una democràcia directa, on jo puc escollir un partit per un seguit d'ideals coincidents, però no lligar-me a aquest per la resta de lligams "en pack".

La meva idea idílica de la política (que pot encaixar dintre de pirata.cat, però encara no hi és) és la d'una democràcia representativa-participativa. No somio en que tothom participi activament de totes les decisions de govern/parlament, ja que ho trobo impossible, no per mitjans (crec que de poder-se fer, es pot fer) sinó per que molta gent no està implicada en política, no en vol estar, i obligar-los seria un error.

És per això que mantindria el sistema de representants amb un matís: Cada ciutadà individual podria, puntualment, substreure el seu vot del seu representant i votar diferent.

En aquest món idílic, el polític perdria el seu paper de "persona de poder" i guanyaria un paper on hauria de complir 2 feines: proposar idees i defensar-les.

Fi de totxopost.