tag:blogger.com,1999:blog-66196822419341174892024-03-14T06:17:35.516+01:00Atridas vs Demostenes (la parra definitiva)Isaac "Atridas" Serranohttp://www.blogger.com/profile/10992118315015501330noreply@blogger.comBlogger140125tag:blogger.com,1999:blog-6619682241934117489.post-20165555745092810382015-01-04T18:37:00.002+01:002015-01-04T18:37:47.621+01:00Memory ManagmentAs 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.<br />
<br />
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.<br />
<br />
So, what do I want to talk about? Well, there is <a href="https://www.youtube.com/watch?v=TH9VCN6UkyQ">this talk</a> 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 <i>inspiration </i>before.<br />
<br />
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.<br />
<br />
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: <i>a garbage collector is not a bad thing, even in games</i>. Are you still here? Good. Now I'm gonna give a little of what you want to hear: <i>the problem is not the garbage collector, the problem is forcing the programmer to use it</i>.<br />
<br />
Do I have your attention now? I hope so.<br />
<br />
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.<br />
<br />
How?<br />
<h4>
Memory Primitives</h4>
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).<br />
<br />
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 <b>std::shared_prt<my_class> </my_class></b>that is at least 15 characters longer than it should, and <b>sp<my_class></my_class></b> won't cut it, because I want the code to be clearer than that.<br />
<br />
<h4>
More Memory Primitives</h4>
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:<br />
<br />
<ul>
<li>Strong references.</li>
<li>Weak references</li>
<li>Allocators</li>
<li>A deallocate reference operation (optional... sometimes).</li>
</ul>
<div>
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.</div>
<div>
<br /></div>
<div>
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.</div>
<div>
<br /></div>
<div>
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.</div>
<div>
<br /></div>
<div>
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.</div>
<h4>
Examples</h4>
<div>
So, what is all this about? Will something usefull emerge from this? I say yes, at least for me.</div>
<div>
<br /></div>
<div>
First consider some kinds of Allocators we can provide:</div>
<div>
<br /></div>
<div>
<ul>
<li>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?</li>
<li>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.</li>
<li>Double stack allocator. Now I'm just listing a random "allocators usefull for game developing" list on the internet.</li>
<li>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, </li>
</ul>
</div>
<div>
<br /></div>
<br />
<h4>
Conclusion</h4>
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.<br />
<br />Isaac "Atridas" Serranohttp://www.blogger.com/profile/10992118315015501330noreply@blogger.com0tag:blogger.com,1999:blog-6619682241934117489.post-44223912616335555492012-11-26T14:36:00.001+01:002012-11-26T14:48:34.379+01:00Una persona, un votEm 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:<br />
<br />
<span style="font-family: Courier New, Courier, monospace;"> Vots Total</span><br />
<span style="font-family: Courier New, Courier, monospace;">CiU 1.112.341 30.41%</span><br />
<span style="font-family: 'Courier New', Courier, monospace;">PSC 523.333 14,31%</span><br />
<span style="font-family: Courier New, Courier, monospace;">ERC 496.292 13,57%</span><br />
<span style="font-family: Courier New, Courier, monospace;">PP 471.197 12,88%</span><br />
<span style="font-family: Courier New, Courier, monospace;">ICV 358.857 9,81%</span><br />
<span style="font-family: Courier New, Courier, monospace;">C's 274.925 7,52%</span><br />
<span style="font-family: Courier New, Courier, monospace;">CUP 126.219 3,45%</span><br />
<span style="font-family: Courier New, Courier, monospace;">PxC 60.142 1,64%</span><br />
<span style="font-family: Courier New, Courier, monospace;">SI 46.608 1,27%</span><br />
<span style="font-family: Courier New, Courier, monospace;">Eb 27.874 0,76%</span><br />
<span style="font-family: Courier New, Courier, monospace;">PACMA 20.777 0,56%</span><br />
<span style="font-family: Courier New, Courier, monospace;">PIRATA.CAT 17.942 0,49%</span><br />
<span style="font-family: Courier New, Courier, monospace;">Altres 35.812 0,97%</span><br />
<span style="font-family: Courier New, Courier, monospace;">En blanc 52.899 1,45%</span><br />
<span style="font-family: Courier New, Courier, monospace;">Nuls 32.232 0,88%</span><br />
<span style="font-family: Courier New, Courier, monospace;">Total 3.657.450</span><br />
<br />
<br />
Segon, repartir els escons de la següent manera:<br />
<br />
<ol>
<li>Entren al parlament aquelles formacions que hagin tret, com a mínim, un <b>1/135</b> dels vots (0,74%).</li>
<li>Per cada <b>1/136</b> de vots sobre el total de les formacions que han entrat, es garanteix un escó.</li>
<li>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.*</li>
</ol>
<div>
<br /></div>
<div>
<span style="font-family: Courier New, Courier, monospace;"> Vots Total Escons Residu Adicional Total</span><br />
<span style="font-family: Courier New, Courier, monospace;">CiU 1.112.341 31,80% 43 </span><span style="font-family: 'Courier New', Courier, monospace;">0,</span><span style="font-family: 'Courier New', Courier, monospace;">25 31,85%</span><br />
<span style="font-family: 'Courier New', Courier, monospace;">PSC 523.333 14,96% 20 </span><span style="font-family: 'Courier New', Courier, monospace;">0,</span><span style="font-family: 'Courier New', Courier, monospace;">35 14,81%</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace;">ERC 496.292 14,18% 19 </span><span style="font-family: 'Courier New', Courier, monospace;">0,</span><span style="font-family: 'Courier New', Courier, monospace;">29 14,07%</span><br />
<span style="font-family: Courier New, Courier, monospace;">PP 471.197 13,47% 18 </span><span style="font-family: 'Courier New', Courier, monospace;">0,</span><span style="font-family: 'Courier New', Courier, monospace;">32 13,33%</span><br />
<span style="font-family: Courier New, Courier, monospace;">ICV 358.857 10,26% 13 0,95 +1 -> 14 10,37%</span><br />
<span style="font-family: Courier New, Courier, monospace;">C's 274.925 7,86% 10 0,69 </span><span style="font-family: 'Courier New', Courier, monospace;">+1 -> </span><span style="font-family: Courier New, Courier, monospace;">11 7,41%</span><br />
<span style="font-family: Courier New, Courier, monospace;">CUP 126.219 3,61% 4 0,91 </span><span style="font-family: 'Courier New', Courier, monospace;">+1 -> </span><span style="font-family: Courier New, Courier, monospace;">5 3,71%</span><br />
<span style="font-family: Courier New, Courier, monospace;">PxC 60.142 1,72% 2 0,34 1,48%</span><br />
<span style="font-family: Courier New, Courier, monospace;">SI 46.608 1,33% 1 0,81 </span><span style="font-family: 'Courier New', Courier, monospace;">+1 -> </span><span style="font-family: Courier New, Courier, monospace;">2 1,48%</span><br />
<span style="font-family: Courier New, Courier, monospace;">Eb 27.874 0.79% 1 0,07 0,74%</span><br />
<span style="font-family: Courier New, Courier, monospace;">Total 3.497.788 131</span></div>
<div>
<br /></div>
<div>
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.</div>
<div>
<br /></div>
<div>
<br /></div>
<div>
* 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.</div>
Isaac "Atridas" Serranohttp://www.blogger.com/profile/10992118315015501330noreply@blogger.com0tag:blogger.com,1999:blog-6619682241934117489.post-70125550494794668372012-10-22T14:15:00.002+02:002012-10-24T14:34:17.654+02:00Vot electrònic (I)<strike>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.</strike><br />
<strike><br /></strike>
<strike>EDIT II: Crec que he trobat una manera de fer que això funcioni, però la revisaré una mica abans de publicar-la.</strike><br />
<br />
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.<br />
<br />
Primer les referències:<br />
<br />
<br />
<pre>@article{<a href="http://dblp.uni-trier.de/db/about/bibtex.html" style="color: black;">DBLP</a>:journals/cacm/Chaum85,
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}
}</pre>
<br />
<br />
BibTex == lol<br />
<br />
I també els apunts del DEIC que baixen i pugen i mai se sap si es mantindràn per gaire temps:<br />
<a href="http://www.deic.uab.es/material/20375-9-protocols.pdf">http://www.deic.uab.es/material/20375-9-protocols.pdf</a><br />
<br />
De què es tracta? De votar per internet.<br />
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.<br />
<br />
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.<br />
<br />
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.<br />
<br />
<span style="font-family: Courier New, Courier, monospace;">-1. La propietat distributiva és que <b>Ei(x)*Ei(y) == Ei(x * y)</b> && <b>Di(x) * Di(y) == Di(x * y)</b>, on <b>Ei(x)</b> és xifrar <b>"x"</b> amb la clau pública de <b>"I"</b> i <b>Di(x)</b> amb la clau privada (signar).</span><br />
<span style="font-family: Courier New, Courier, monospace;">0. Tenim al ciutadà (A) i el parlament (B)</span><br />
<span style="font-family: Courier New, Courier, monospace;">1. El ciutadà tria un nombre aleatòri de 128 bits, que anomenarem <b>"m"</b>.</span><br />
<span style="font-family: Courier New, Courier, monospace;">2. El ciutadà tria un segon nombre aleatòri, el "factor de ceguesa" <b>"k"</b>.</span><br />
<span style="font-family: Courier New, Courier, monospace;">3. El ciutadà calcula <b>mEb(k)</b>. <b>Eb(k)</b> <b>== "k"</b> xifrat amb la clau pública del parlament. <b>mEb(k) == m * Eb(k)</b>.</span><br />
<span style="font-family: Courier New, Courier, monospace;">4. El ciutadà s'identifica amb el DNIe al parlament i li envia mEb(k).</span><br />
<span style="font-family: Courier New, Courier, monospace;">5. El parlament signa <b>mEb(k)</b>, obtenint <b>Db(mEb(k))</b>. Fem una mica de matex amb la propietat distributiva: <b>Db(m * Eb(k)) == Db(m) * Db(Eb(k)) == Db(m) * k == kDb(m)</b></span><br />
<span style="font-family: Courier New, Courier, monospace;">6. El parlament li retorna al ciutadà <b>kDb(m)</b>. S'anota que ja li ha enviat la "butlleta" a aquest ciutadà per no enviar-li una altra.</span><br />
<span style="font-family: Courier New, Courier, monospace;">7. El ciutadà obtè <b>Db(m)</b> gràcies a <b>Db(m) == kDb(m) / k</b></span><br />
<span style="font-family: Courier New, Courier, monospace;">8. En un moment diferent, el ciutadà envia al parlament el seu vot juntament amb <b>Db(m)</b> i <b>"m"</b>. El parlament comprova que la firma és correcte i accepta el vot si <b>"m"</b> no ha estat utilitzat prèviament.</span><br />
<br />
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.<br />
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):<br />
<br />
<span style="font-family: Courier New, Courier, monospace;">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.</span><br />
<span style="font-family: Courier New, Courier, monospace;">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:</span><br />
<span style="font-family: Courier New, Courier, monospace;">Eb(x) = x ^ e (mod N)</span><br />
<span style="font-family: Courier New, Courier, monospace;">Db(x) = x ^ d (mod N)</span><br />
<span style="font-family: Courier New, Courier, monospace;">Per a que funcioni, d = e (mod phi(N)), diria; però és igual...</span><br />
<br />
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 <a href="http://en.wikipedia.org/wiki/Birthday_problem">paradoxa de l'aniversari</a> 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.<br />
<br />
<strike>P.P.S.: Ja li he trobat un error a l'algoritme. Aquesta tarda reviso els apunts, que he de tornar al curro.</strike><br />
<br />
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.Isaac "Atridas" Serranohttp://www.blogger.com/profile/10992118315015501330noreply@blogger.com0tag:blogger.com,1999:blog-6619682241934117489.post-36150843551455217262012-03-29T20:07:00.001+02:002012-03-29T20:15:42.323+02:00Raons per EsquirolejarBones. Avui 29 de març del 2012, vaga general, he treballat.<br />
<br />
<i>I per què, oh esquirol nostre?</i> Doncs ara us ho explico.<br />
<br />
Primer de tot, ens hem de posar en precedents, pq pogueu compsar la meva (manca) d'objectivitat en aquests temes.<br />
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>I a què ve això?</i> Un segon, ara us ho dic.<br />
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).<br />
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.<br />
<br />
En fi, al tema.<br />
<br />
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 <i>insiders </i>i els <i>outsiders</i>.<br />
<br />
Si no teniu ni idea de què és això, us recomano un bloc, el <a href="http://politikon.es/">politikon</a>, força d'esquerres i molt ben documentat (cosa que agraeixo enormement) on en algun lloc (o forces) s'explica molt bé.<br />
<br />
Fent-ne un petit resum, es tracta de que en espanya hi ha 2 tipus de treballadors: els <i>insiders</i> (els que són dintre el sistema i gaudeixen de tota la seva protecció i beneficis) i la dels <i>outsiders </i>(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.<br />
<br />
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: <b>el temps mitjà que una persona està a l'atur és directament proporcional al temps mitjà que una persona està treballant</b>. 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!<br />
<br />
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.<br />
<br />
Tenim un sistema laboral que crea <i>insiders </i>(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 <i>outsiders </i>(gent que està constantment trobant/perdent feina i no aconsegueix entrar a la roda "bona").<br />
<br />
I per què no he volgut fer vaga? (ah, el tema principal) Molt senzill. Per què és una vaga per defensar els drets dels <i>insiders</i>. 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 <i>insiders</i>.<br />
<br />
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:<br />
Amb el tema de les retallades, s'han posat molt i molt durs i molt i molt <i>guerreros </i>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 <i>outsiders </i>a canvi de mantenir els drets dels <i>insiders</i>. 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 <i>cert </i>tipus de treballador.<br />
<br />
I a mi no em representen.<br />
<br />
I a mi no m'ajuden.<br />
<br />
I per això no penso recolzar-los.<br />
<br />
P.S.: Estaré a favor d'una reforma laboral que inclogui el següent: <a href="http://uncontratoparaemplearlosatodos.es/">http://uncontratoparaemplearlosatodos.es/</a><br />
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'<i>insiders</i> sobreprotegits i donant a aquells que fan feines curtes una bona indemnització (que són els realment putejats).Isaac "Atridas" Serranohttp://www.blogger.com/profile/10992118315015501330noreply@blogger.com0tag:blogger.com,1999:blog-6619682241934117489.post-16435075213642346372012-02-16T18:02:00.000+01:002012-02-16T18:02:50.016+01:00Notes sobre Blender (2.61) i Python (Part I)Útil per poder fer exportadors:<br />
<br />
<span style="font-family: 'Courier New', Courier, monospace;">bpy.context.object <span style="color: #38761d;">#objecte actualment seleccionat</span></span><br />
<span style="font-family: 'Courier New', Courier, monospace;"><br />
</span><br />
En general, per exportar un mesh, necessitem la següent informació:<br />
<br />
<br />
<ul><li>Vertexos</li>
<ul><li>Posició</li>
<li>Normals</li>
<li>Coordenades de textura</li>
<li>Pesos (d'animació)</li>
</ul><li>Cares</li>
<ul><li>Apuntadors a 3 vertexos</li>
</ul></ul><div>Per poder construir, hem de donar unes quantes voltes a les dades de Blender, ja que no estan en l'ordre que ens agradaria.</div><div><br />
</div><div><span style="font-family: 'Courier New', Courier, monospace;">*------------------------------------------------*</span></div><div><span style="font-family: 'Courier New', Courier, monospace;">| Objecte |</span></div><div><span style="font-family: 'Courier New', Courier, monospace;">+------------------------------------------------+</span></div><div><span style="font-family: 'Courier New', Courier, monospace;">| - <b>data</b>: |</span></div><div><span style="font-family: 'Courier New', Courier, monospace;">| *------------------------------------------* |</span></div><div><span style="font-family: 'Courier New', Courier, monospace;">| | Mesh | |</span></div><div><span style="font-family: 'Courier New', Courier, monospace;">| +------------------------------------------+ |</span></div><div><span style="font-family: 'Courier New', Courier, monospace;">| | - <b>faces</b>: Array de: | | </span></div><div><span style="font-family: 'Courier New', Courier, monospace;">| | *------------------------------------* | | </span></div><div><span style="font-family: 'Courier New', Courier, monospace;">| | | MeshFace | | |</span></div><div><span style="font-family: 'Courier New', Courier, monospace;">| | +------------------------------------+ | |</span></div><div><span style="font-family: 'Courier New', Courier, monospace;">| | | - <b>vertices</b>: Array de 3 o 4 ints </span><span style="font-family: 'Courier New', Courier, monospace;">| | |</span></div><div><span style="font-family: 'Courier New', Courier, monospace;">| | | que indiquen els vertexos </span><span style="font-family: 'Courier New', Courier, monospace;">| | |</span></div><div><span style="font-family: 'Courier New', Courier, monospace;">| | | corresponents | | |</span></div><div><span style="font-family: 'Courier New', Courier, monospace;">| | | | | |</span></div><div><span style="font-family: 'Courier New', Courier, monospace;">| | | - <b>material_index</b>: index al material| | |</span></div><div><span style="font-family: 'Courier New', Courier, monospace;">| | | de la cara. | | |</span></div><span style="font-family: 'Courier New', Courier, monospace;">| | | | | |</span><div><span style="font-family: 'Courier New', Courier, monospace;">| | | - <b>normal</b>: normal a la cara | | |</span><div><span style="font-family: 'Courier New', Courier, monospace;">| | *------------------------------------* | |</span></div><div><span style="font-family: 'Courier New', Courier, monospace;">| | | |</span></div><div><span style="font-family: 'Courier New', Courier, monospace;">| | - <b>vertices</b>: Array de: | |</span></div><div><span style="font-family: 'Courier New', Courier, monospace;">| | *------------------------------------* | |</span></div><div><span style="font-family: 'Courier New', Courier, monospace;">| | | MeshVertex | | |</span></div><div><span style="font-family: 'Courier New', Courier, monospace;">| | +------------------------------------+ | |</span></div><div><span style="font-family: 'Courier New', Courier, monospace;">| | | - <b>co</b>: Array de 3 floats indicant | | |</span></div><div><span style="font-family: 'Courier New', Courier, monospace;">| | | les coordenades | | |</span></div><div><span style="font-family: 'Courier New', Courier, monospace;">| | | | | |</span></div><div><span style="font-family: 'Courier New', Courier, monospace;">| | | - <b>groups</b>: Array de: | | |</span></div><div><span style="font-family: 'Courier New', Courier, monospace;">| | | *------------------------------* | | |</span></div><div><span style="font-family: 'Courier New', Courier, monospace;">| | | | VertexGroupElement | | | |</span></div><div><span style="font-family: 'Courier New', Courier, monospace;">| | | +------------------------------+ | | |</span></div><div><span style="font-family: 'Courier New', Courier, monospace;">| | | | - weight: pes de l'os | | | |</span></div><div><span style="font-family: 'Courier New', Courier, monospace;">| | | | | | | |</span></div><div><span style="font-family: 'Courier New', Courier, monospace;">| | | | - group: index del grup | | | |</span></div><div><span style="font-family: 'Courier New', Courier, monospace;">| | | *------------------------------* | | |</span></div><div><span style="font-family: 'Courier New', Courier, monospace;">| | | | | |</span></div><div><span style="font-family: 'Courier New', Courier, monospace;">| | *------------------------------------* | |</span></div><div><span style="font-family: 'Courier New', Courier, monospace;">| | | |</span></div><div><span style="font-family: 'Courier New', Courier, monospace;">| | - <b>uv_textures</b>: Mapa de | |</span></div><div><span style="font-family: 'Courier New', Courier, monospace;">| | *------------------------------------* | |</span></div><div><span style="font-family: 'Courier New', Courier, monospace;">| | | MeshTextureFaceLayer | | |</span></div><div><span style="font-family: 'Courier New', Courier, monospace;">| | +------------------------------------+ | |</span></div><div><span style="font-family: 'Courier New', Courier, monospace;">| | | - <b>name</b> | | |</span></div><div><span style="font-family: 'Courier New', Courier, monospace;">| | | | | |</span></div><div><span style="font-family: 'Courier New', Courier, monospace;">| | | - <b>data</b>: Array on cada element | | |</span></div><div><span style="font-family: 'Courier New', Courier, monospace;">| | | correspon a una cara | | |</span></div><div><span style="font-family: 'Courier New', Courier, monospace;">| | | *------------------------------* | | |</span></div><div><span style="font-family: 'Courier New', Courier, monospace;">| | | | </span><span style="font-family: 'Courier New', Courier, monospace;">MeshTextureFace | | | |</span></div><div><span style="font-family: 'Courier New', Courier, monospace;">| | | +------------------------------+ | | |</span></div><div><span style="font-family: 'Courier New', Courier, monospace;">| | | | - <b>uv1</b>: coordenades del 1r | | | |</span></div><div><span style="font-family: 'Courier New', Courier, monospace;">| | | | vertex | | | |</span></div><div><span style="font-family: 'Courier New', Courier, monospace;">| | | | | | | |</span></div><div><span style="font-family: 'Courier New', Courier, monospace;">| | | | - <b>uv2</b>: coordenades del 2n | | | |</span></div><div><span style="font-family: 'Courier New', Courier, monospace;">| | | | vertex | | | |</span></div><div><span style="font-family: 'Courier New', Courier, monospace;">| | | | | | | |</span></div><div><span style="font-family: 'Courier New', Courier, monospace;">| | | | - <b>uv3</b>: coordenades del 3r | | | |</span></div><div><span style="font-family: 'Courier New', Courier, monospace;">| | | | vertex | | | |</span></div><div><span style="font-family: 'Courier New', Courier, monospace;">| | | | | | | |</span></div><div><span style="font-family: 'Courier New', Courier, monospace;">| | | | - <b>uv4</b>: coordenades del 4rt | | | |</span></div><div><span style="font-family: 'Courier New', Courier, monospace;">| | | | vertex | | | |</span></div><div><span style="font-family: 'Courier New', Courier, monospace;">| | | *------------------------------* | | |</span></div><div><span style="font-family: 'Courier New', Courier, monospace;">| | | | | |</span></div><div><span style="font-family: 'Courier New', Courier, monospace;">| | *------------------------------------* | |</span></div><div><span style="font-family: 'Courier New', Courier, monospace;">| | | |</span></div><div><span style="font-family: 'Courier New', Courier, monospace;">| | - <b>materials</b>: array de materials (dades | |</span></div><div><span style="font-family: 'Courier New', Courier, monospace;">| | apuntades per separat) | |</span></div><div><span style="font-family: 'Courier New', Courier, monospace;">| *------------------------------------------* |</span></div><div><span style="font-family: 'Courier New', Courier, monospace;">| |</span></div><div><span style="font-family: 'Courier New', Courier, monospace;">| - <b>vertex_groups</b>: Array de: |</span></div><div><span style="font-family: 'Courier New', Courier, monospace;">| *------------------------------------------* |</span></div><div><span style="font-family: 'Courier New', Courier, monospace;">| | VertexGroup | |</span></div><div><span style="font-family: 'Courier New', Courier, monospace;">| +------------------------------------------+ |</span></div><div><span style="font-family: 'Courier New', Courier, monospace;">| | - <b>name</b>: nom del grup (de l'ós que | |</span></div><div><span style="font-family: 'Courier New', Courier, monospace;">| | influencia) | |</span></div><div><span style="font-family: 'Courier New', Courier, monospace;">| *------------------------------------------* |</span></div><div><span style="font-family: 'Courier New', Courier, monospace;">| |</span></div><div><span style="font-family: 'Courier New', Courier, monospace;">*------------------------------------------------*</span></div><div><br />
</div><div>Ara que ja tenim informació de les malles, per definir el material necessitem:</div><div><ul><li>Paràmetres d'especular</li>
<li>Paràmetres de paral·lax</li>
<li>Alpha blended</li>
<li>Textures</li>
<ul><li>Nom</li>
<li>Tipus</li>
</ul></ul></div><div><br />
</div><div><span style="font-family: 'Courier New', Courier, monospace;">*------------------------------------------------*</span></div><div><span style="font-family: 'Courier New', Courier, monospace;">| Material |</span></div><div><span style="font-family: 'Courier New', Courier, monospace;">+------------------------------------------------+</span></div><div><span style="font-family: 'Courier New', Courier, monospace;">| - <b>specular_intensity</b> |</span></div><div><span style="font-family: 'Courier New', Courier, monospace;">| |</span></div><div><span style="font-family: 'Courier New', Courier, monospace;">| - <b>specular_hardness</b>: (potència especular) |</span></div><div><span style="font-family: 'Courier New', Courier, monospace;">| |</span></div><div><span style="font-family: 'Courier New', Courier, monospace;">| - <b>texture_slots</b>: Mapa de: |</span></div><div><span style="font-family: 'Courier New', Courier, monospace;">| *------------------------------------------* |</span></div><div><span style="font-family: 'Courier New', Courier, monospace;">| | MaterialTextureSlot | |</span></div><div><span style="font-family: 'Courier New', Courier, monospace;">| +------------------------------------------+ |</span></div><div><span style="font-family: 'Courier New', Courier, monospace;">| | - <b>use_map_alpha</b>: si utilitza l'alpha | |</span></div><div><span style="font-family: 'Courier New', Courier, monospace;">| | | |</span></div><div><span style="font-family: 'Courier New', Courier, monospace;">| | - <b>use_map_color_diffuse</b>: textura | |</span></div><div><span style="font-family: 'Courier New', Courier, monospace;">| | d'albedo (color) | |</span></div><div><span style="font-family: 'Courier New', Courier, monospace;">| | | |</span></div><div><span style="font-family: 'Courier New', Courier, monospace;">| | - <b>use_map_normal</b>: mapa de normals | |</span></div><div><span style="font-family: 'Courier New', Courier, monospace;">| | | |</span></div><div><span style="font-family: 'Courier New', Courier, monospace;">| | - <b>use_map_displacement</b>: mapa d'alçades | |</span></div><div><span style="font-family: 'Courier New', Courier, monospace;">| | | |</span></div><div><span style="font-family: 'Courier New', Courier, monospace;">| | - <b>texture.image:</b> (la textura ha de tenir | |</span></div><div><span style="font-family: 'Courier New', Courier, monospace;">| | el tipus correcte) | |</span></div><div><span style="font-family: 'Courier New', Courier, monospace;">| | *------------------------------------* | |</span></div><div><span style="font-family: 'Courier New', Courier, monospace;">| | | Image | | |</span></div><div><span style="font-family: 'Courier New', Courier, monospace;">| | +------------------------------------+ | |</span></div><div><span style="font-family: 'Courier New', Courier, monospace;">| | | - <b>name</b> | | |</span></div><div><span style="font-family: 'Courier New', Courier, monospace;">| | | | | |</span></div><div><span style="font-family: 'Courier New', Courier, monospace;">| | | - <b>filepath_raw</b>: fitxer on es | | |</span></div><div><span style="font-family: 'Courier New', Courier, monospace;">| | | guarda la imatge | | |</span></div><div><span style="font-family: 'Courier New', Courier, monospace;">| | | | | |</span></div><div><span style="font-family: 'Courier New', Courier, monospace;">| | | - <b>save</b>(): guarda la imatge | | |</span></div><div><span style="font-family: 'Courier New', Courier, monospace;">| | *------------------------------------* | |</span></div><div><span style="font-family: 'Courier New', Courier, monospace;">| | | |</span></div><div><span style="font-family: 'Courier New', Courier, monospace;">| *------------------------------------------* |</span></div><div><span style="font-family: 'Courier New', Courier, monospace;">| |</span></div><div><span style="font-family: 'Courier New', Courier, monospace;">*------------------------------------------------*</span></div></div>Isaac "Atridas" Serranohttp://www.blogger.com/profile/10992118315015501330noreply@blogger.com1tag:blogger.com,1999:blog-6619682241934117489.post-63170168750465724492012-02-09T16:27:00.000+01:002012-02-09T16:27:45.862+01:00Per 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'<a href="http://store.steampowered.com/">Steam</a> (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.<br />
<br />
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.<br />
<br />
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 <b>que m'he comprat</b>, 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.<br />
<br />
Així que passarà una temporada fins que em torni a plantejar comprar un joc que dugui el nom de Bethesda en alguna banda, <i>if you know what I mean</i>.Isaac "Atridas" Serranohttp://www.blogger.com/profile/10992118315015501330noreply@blogger.com0tag:blogger.com,1999:blog-6619682241934117489.post-16887447439213243042012-02-08T15:27:00.000+01:002012-02-08T15:27:05.332+01:00Anacronismes de lateralitat política.<span style="font-family: arial; font-size: x-small;">Aqui apunto la resposta que vaig escriure a un amic meu respecte a la demanda de la meva afirmació de "</span><span style="background-color: white; color: #444444; font-family: Arial, 'Helvetica Neue', sans-serif; font-size: 15px; line-height: 19px; text-align: left;">Parlar d'esquerres i dretes avui dia és un anacronisme."</span><br />
<span style="font-family: arial; font-size: x-small;"><br />
</span><br />
<span style="font-family: arial; font-size: x-small;">------------------------------------------------------------------------------------------------------------------------------------------------------------</span><br />
<span style="font-family: arial; font-size: x-small;"><br />
</span><br />
<span style="font-family: arial; font-size: x-small;"><br />
</span><br />
<span style="font-family: arial; font-size: x-small;">"Dretes" i "Esquerres" són denominacions difuses que ja poca gent sap </span><span style="font-family: arial; font-size: x-small;">què</span><span style="font-family: arial; font-size: x-small;"> vol dir. En un principi </span><span style="font-family: arial; font-size: x-small;">haurien</span><span style="font-family: arial; font-size: x-small;"> 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.</span><br />
<div style="font-family: arial; font-size: small;"><br />
</div><div style="font-family: arial; font-size: small;">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").</div><div style="font-family: arial; font-size: small;"><br />
</div><div style="font-family: arial; font-size: small;">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.</div><div style="font-family: arial; font-size: small;"><br />
</div><div style="font-family: arial; font-size: small;"><div style="font-family: 'Times New Roman'; font-size: medium;"><span style="font-family: arial; font-size: x-small;">------------------------------------------------------------------------------------------------------------------------------------------------------------</span></div></div><div style="font-family: arial; font-size: small;">I fins aqui el tema principal. Una mica de publicitat.</div><div style="font-family: arial; font-size: small;"><br />
</div><div style="font-family: arial; font-size: small;">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".</div><div style="font-family: arial; font-size: small;"><br />
</div><div><span style="font-family: arial; font-size: x-small;">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.</span></div><div><span style="font-family: arial; font-size: x-small;"><br />
</span></div><div><span style="font-family: arial; font-size: x-small;">É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.</span></div><div><span style="font-family: arial; font-size: x-small;"><br />
</span></div><div><span style="font-family: arial; font-size: x-small;">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.</span></div><div><span style="font-family: arial; font-size: x-small;"><br />
</span></div><div><span style="font-family: arial; font-size: x-small;">Fi de totxopost.</span></div>Isaac "Atridas" Serranohttp://www.blogger.com/profile/10992118315015501330noreply@blogger.com0tag:blogger.com,1999:blog-6619682241934117489.post-34172016637349721912011-11-22T00:28:00.001+01:002011-11-22T16:01:47.626+01:00Sistemes electoralsBones.<br />
<br />
Continuant amb el tema i havent parlat amb algun pirata sobre sistemes electorals, he pensat de dissenyar-ne un (no m'hi poso pas per poc).<br />
<br />
La idea és agafar el que tenim, inspirar-me en propostes vigents en altres països (tot gira al voltant del <a href="http://en.wikipedia.org/wiki/Single_transferable_vote">STV</a>).<br />
<br />
Què tenim de bo? Poca cosa. M'agrada que hi hagi representativitat lligada al territori. Estic en contra de la circumscripció única, ja que m'agradaria que hi hagi "proximitat".<br />
<br />
Què falta? Primer, i sobretot, proporcionalitat. No pot ser que els vots d'uns ciutadans contin més que els d'altres, fi. No pot ser que un partit amb amb el 44% dels vots tingui el 53% dels diputats, i que un altre amb el 7.1% dels vots tingui el 3.1% dels diputats (menys de la meitat).<br />
<br />
En segon punt a millorar, parlaré d'obrir les llistes, però no totalment, doncs és difícil de fer el sistema que m'imagino amb llistes totalment obertes.<br />
<br />
Tercer punt, important, eliminar el concepte "vot útil". Tots els vots han de ser igual d'útils.<br />
<br />
Comencem.<br />
<br />
<span class="Apple-style-span" style="font-size: large;"><b>Primer: Què voten les persones.</b></span><br />
<br />
Cada persona tindrà a la seva disposició la llista de tots els partits que es presentin, que haurà de numerar en preferència (1 el més preferent, 2 el segon, etc...). Aquí hi ha 2 alternatives, la primera és limitar el màxim de nombres, i la segona és no fer-ho. Per una banda hi ha donar la llibertat total als electors, però per l'altre hi ha un problema de logística important (la complexitat del sistema és d'ordre O(n!) on "n" és el nombre d'opcions, per tant limitar-ho és interessant) i també el fet de que la segona opció té poc pes al sistema, i el tercer és ja pràcticament negligibles.<br />
<br />
Després, l'elector tindrà la opció de reordenar els diputats de les 2 primeres llistes (sense intercanviar-los). Això és conegut com a "llistes desbloquejades".<br />
<br />
<b><span class="Apple-style-span" style="font-size: large;">Segon: Cambres.</span></b><br />
<br />
Senat fora, no serveix per a res.<br />
<br />
En quan al congrés, hi ha un límit constitucional de que hi hagi entre 300 i 400 diputats. Anem a distribuir-los.<br />
<br />
Comencem tal i com es fa actualment, 2 per provincia, un per ceuta i un per melilla. La resta, fins a arribar a 300, es distribueixen segons la població (Podriem aquí fer un Homt o Sainte-Languë) per cada provincia. Aquests són els representants "fixes", o "mínims" que cada província aportarà al congrés.<br />
<br />
Els 100 diputats que queden, una quarta part, serviran per re-equilibrar els vots dels ciutadans. Si, per exemple una candidatura ha rebut un suport per sota del llindar per treure un diputat en moltes províncies, aquests vots es poden "sumar" per treure'n un d'aquests 100. Això farà que el resultat final en quan a diputats sigui molt més representatiu.<br />
<br />
Aquests 100 diputats es tornen a repartir segons la població per totes les províncies. Sumant amb el nombre anterior dóna el nombre màxim d'escons que una província pot aportar. Aquests seran el nombre mínim de candidats que una força política haurà d'incloure a la llista de cada província, no havent-hi màxim.<br />
<br />
<span class="Apple-style-span" style="font-size: large;"><b>Tercer: Recompte</b></span><br />
<br />
El recompte té tres fases: Primer escollir quants membres de cada partit en cada circumscripció són escollits directament per aquesta, en la segona fase es trien els diputats "d'equilibri": a quin partit pertanyen i de quina llista (circumscripció) surten. Finalment, es decideix, per cada circumscripció i partit, quins dels candidats són finalment escollits (i s'ordena la resta per fer de "suplents").<br />
<br />
<b>Primera fase.</b><br />
<br />
Mitjançant un mètode inspirat al del "Vot únic transferible" (STV per les seves sigles en anglès) es trien els diputats de la província.<br />
<br />
Aquí partim d'unes butlletes on hi ha numerades les preferències dels electors ( 1 - Partit dels Cargols, 2 - Partit de les Libèl·lules, etc...). De moment només ens fixem en la primera opció.<br />
<br />
Es calcula la quota del coeficient de Droop (jo el modifico una mica, perdoneu-me):<br />
coeficient = (vots totals vàlids) / ( (escons a escollir) + 1)<br />
El coeficient original és enter, jo el vui fer servir com a real.<br />
<br />
Seguidament, per cada partit que superi (estrictament) el coeficient en nombre de vots, se li resta el coeficient i se li suma un diputat, fins que cap partit tingui un nombre de "vots restants" estrictament superior al coeficient.<br />
<br />
Ara comença lo bo:<br />
<br />
Es comencen a eliminar partits. Si en qualsevol moment queden tants partits "vius" com escons a escollir, es reparteixen automàticament 1 a cada un.<br />
<br />
S'elimina el partit amb menys vots, i els vots que li resten es reparteixen entre els altres. Com? Tenint en compte les segones opcions d'aquells que han votat el partit eliminat. Si s'elimina el Partit dels Cargols, amb 500 vots restants, i un 20% dels seus electors han posat el Partit de les Libèl·lules com a segona opció, aleshores se li sumen 100 vots al Partit de les Libèl·lules (el 20% de 500). D'aquests 100 vots cal compatibilitzar la tercera opció, que es suma a les segones del Partit de les Libèl·lules, i així successivament.<br />
<br />
Si algun partit ha arribat a superar la quota, se li adjudica un escó, restant-li els vots corresponents.<br />
<br />
Amb aquest complex algorisme, es trien quants representants de cada partit van per cada comarca. L'algorisme té les següents característiques:<br />
<br />
<ul><li>El vot és únic, només serveix per un partit.</li>
<li>Si el partit que has escollit com a primera opció no aconsegueix cap representant, el teu vot serveix, amb el mateix pes, a la segona opció (i així successivament).</li>
<li>Si el partit que has escollit obté representació, però li "sobren vots" (té prou vots per aconseguir un escó, però no suficients per arribar al segon), aquests es reparteixen a segones opcions, havent restat el pes que representa ja haver escollit algun diputat.</li>
<li>Concretament, si la teva primera opció no obté representació, la segona obté el teu vot <u>amb el mateix pes</u> que qualsevol altre vot amb primera opció, si aquesta tampoc, passa a la tercera opció igual, etc... Si la teva primera opció obté un escó, el teu vot passa a la segona amb la meitat del pes, 2 diputats, 1/3, etc... La tercera opció rep el vot diluït per els escons obtinguts per les 2 primeres sumades, i així successivament.</li>
</ul><div><b>Segona Fase</b></div><div><br />
</div><div>Queden 100 diputats, que cal escollir de tal manera per reequilibrar el parlament per a que recuperi la proporcionalitat que les urnes creen però les circumscripcions retallen.</div><div><br />
</div><div>Per fer-ho es torna a calcular el coeficient abans esmentat i s'agafen el nombre de vots TOTALS a tot el país de cada partit i el nombre d'escons aconseguit per cada partit. Aleshores es resta una vegada el coeficient al recompte de vots restants a cada partit per cada escó ja aconseguit (són vots que "ja ha utilitzat"). Amb el que queda es repeteix l'algorisme STV de l'apartat anterior*.</div><div><br />
</div><div>* Pot ser que quedin nombres de vots restants negatius. Amb un 12% d'escons de re-equilibri n'hi poden quedar segur, però amb un 25% no ho tinc tant clar, caldria mirar-ho. En tot cas, què s'ha de fer si això passa no ho tinc molt pensat, de moment eliminaria el partit i treuria del recompte de "vots vàlids totals" els vots que aquest partit hagués tret, i recalcularia el coeficient.</div><div><br />
</div><div>Després toca triar quina província va cada diputat extra. Aquí s'acaba el STV i passem al Sainte-Languë (un sistema similar a la llei d'Homt). Girem una mica la truita i compatibilitzem les províncies com si fossin candidates i els vots al partit que ha guanyat l'escó (o escons) extra a cada província ens serveixen per decidir a quina província va aquest diputat extra. A l'hora de calcular el coeficient a cada província necessitem comptavilitzar també els escons guanyats per aquest partit en aquella província a la primera fase.</div><div><br />
</div><div><br />
</div><div>Per exemple el Partit dels Cargols ha guanyat 2 escons a Barcelona amb 170.000 vots, però cap a Girona, Lleida ni Tarragona, on hi té 30.000, 15.000 i 16.000 vots respectivament. Aquest partit ha guanyat 2 representants extres en aquesta fase.</div><div><br />
</div><div>El coeficient és de [170.000/ (2*2 + 1) =] 34.000 per Barcelona, 30.000 per Girona, 15.000 per Lleida i 16.000 per Tarragona, per tant el primer escó va a Barcelona, que modifica el seu coeficient i el deixa a [170.000 / (3*2 + 1) =] 24.286, que com és inferior al coeficient de Girona aquesta última província és la que guanya el diputat. Ni Lleida ni Tarragona han obtingut cap escó, però els vots allà obtinguts han ajudat a aconseguir els escons extra per Barcelona i Girona.</div><div><br />
</div><div>Aquest sistema, a més de les característiques de la primera fase guanya les següents característiques:</div><div><ul><li>Al compatibilitzar els resultats obtinguts en la primera fase, serveix per equilibrar els resultats que l'arrodoniment que el sistema de circumscripcions desequilibra. El resultat final sempre és altament representatiu i la diferència entre el % de vots obtinguts (respecte el total de vots a les forces amb representació parlamentària) i el % d'escons obtinguts mai s'allunya més d'un 1% (absolut).</li>
<li>Tota força amb més del 0.25% de vots aconsegueix un escó (1 diputat és el 0.25% del total).</li>
<li>El teu vot, si no aconsegueix donar un escó a la teva província pot ajudar a una altra província a sumar prou per obtenir escó de la força que tu has triat. O al revés, et pots ajudar de vots "orfes" d'altres províncies per tal de poder obtenir escons extra.</li>
<li>La única manera de que un vot no sigui útil és que cap de les forces que has escollit (en pots triar 5) obtingui representació, cosa que és molt complicada ja que a mesura que s'eliminin opcions minoritàries els vots a aquestes tendirien a agrupar-se a altres opcions minoritàries i eventualment alguna obtindria representació.</li>
</ul><div><b>Última Fase.</b></div></div><div><br />
</div><div>Aquesta és la fase més senzilla de totes (especialment per qui hagi pogut seguir les anteriors). Recuperem el mètode STV per decidir quins candidats de cada força surten de cada província ara que ja sabem quants n'han de sortir. Només es poden canviar l'ordre de llista de les dues primeres opcions, per tal d'evitar "boicots" a llistes "enemigues", es podria revisar.</div><div><br />
</div><div><span class="Apple-style-span" style="font-size: large;"><b>Conclusions</b></span></div><div><br />
</div><div>El mètode que proposo permet:</div><div><ul><li>Mantenir representativitat territorial (Cada diputat surt d'un territori i farà bé de recordar a qui representa).</li>
<li>Equilibrar el resultat final, que no hi hagi una diferència esperpèntica entre el percentatge de vot al percentatge d'escons obtinguts.</li>
<li>Eliminar el "vot inútil". Si no ajudes a la primera força de la teva elecció a obtenir un escó, ajudaràs a la segona, o a la tercera, o...</li>
<li>Encara que no ajudis a la teva primera elecció a obtenir un escó a la teva circumscripció, és probable que l'ajudis a obtenir per una altra. Les forces polítiques farien bé de recordar la solidaritat de quins territoris l'han ajudat a aconseguir poder.</li>
<li>Desbloquejar les llistes i decidir l'ordre de cada candidat en cada partit polític.</li>
</ul><div>Fi.</div></div><div><br />
</div><div>Gràcies a aquells que hagin tingut la santa paciència d'haver-se llegit tot això. Es nota que ara sóc un ni-ni, jejeje.... :-(</div>Isaac "Atridas" Serranohttp://www.blogger.com/profile/10992118315015501330noreply@blogger.com1tag:blogger.com,1999:blog-6619682241934117489.post-8228268038513840372011-11-21T04:14:00.007+01:002011-11-21T15:34:27.220+01:00Eleccions generalsAvui, hi ha hagut eleccions generals. Suposo que no sorprenc a ningú.<br />
<br />
Mirant els resultats (<a href="http://www.generales2011.mir.es/99CG/DCG99999TO_L1.htm">http://www.generales2011.mir.es/99CG/DCG99999TO_L1.htm</a>) m'han sorprès un parell de coses.<br />
<br />
La primera, el PP ha guanyat uns 550.000 vots (+5.37%) i 32 escons (+20.75%) respecte les últimes eleccions. Sorpren.<br />
<br />
Després destaco EQUO i PACMA. Ambdós han superat a vàries forces que han entrat al parlament en nombre de vots (EQUO n'ha superat a 5!) i cap dels 2 ha entrat.<br />
<br />
Finalment, al PP cada escó li ha costat uns 58.200 vots, mentre que a UPyD més de 228.000. Equo té 215.000 vots i no ha aconseguit cap escó.<br />
<br />
<br />
És per això que he decidit fer un "sondeig" del resultat electoral amb diferents sistemes:<br />
<br />
Les columnes són:<br />
Nom del partit (1), total vots (2 [99.9% escrutat]), % de vots (3), diputats actuals i % sobre el total (4 i 5), amb circumscripció única (6 i 7), ídem, però canviant llei d'Homt per Sainte-Laguë "light", sense el "1.4" (8 i 9), i fent el sistema "norueg", que explico després (10 i 11).<br />
<br />
Sobre els percentatges, incloc el persentatge de diputats, i el persentatge de vots sobre el total entre les forces amb representació ( % de diputats / % de vots ).<br />
<br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"></span><br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"></span><br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"></span><br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"> 1 2 3 4 5 6 7 8 9 10 11 </span><br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"> partit vots % vot resultats Homt Sainte-Languë Noruega</span><br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">PP 10.830.035 44,62% 186 (53.%/47.%) 164 (48.%/46.%) 159 (45.%/46.%) 210 (52.%/46.%)</span><br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">PSOE 6.973.351 28,73% 110 (31.%/30.%) 105 (30.%/30.%) 103 (29.%/29.%) 125 (31.%/30.%)</span><br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">CiU 1.013.979 4,17% 16 (4.6%/4.4%) 15 (4.3%/4.3%) 15 (4.3%/4.3%) 18 (4.5%/4.3%)</span><br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">IU-LV 1.680.639 6,92% 11 (3.1%/7.3%) 25 (7.1%/7.1%) 25 (7.1%/7.1%) 15 (3.7%/7.1%)</span><br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">AMAIUR 333.628 1,37% 7 (2.0%/1.4%) 5 (1.4%/1.4%) 5 (1.4%/1.4%) 8 (2.0%/1.4%)</span><br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">UPyD 1.140.116 4,69% 5 (1.4%/4.9%) 17 (4.9%/4.8%) 17 (4.9%/4.8%) 7 (1.7%/4.8%)</span><br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">EAJ-PNV 323.517 1,33% 5 (1.4%/1.4%) 4 (1.1%/1.4%) 5 (1.4%/1.4%) 6 (1.5%/1.4%)</span><br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">ESQUERRA 256.304 1,05% 3 (.86%/1.1%) 3 (.86%/1.1%) 4 (1.1%/1.1%) 4 (1.0%/1.1%)</span><br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">BNG 183.279 0,75% 2 (.57%/.79%) 2 (.57%/.78%) 3 (.86%/.77%) 2 (.50%/.78%)</span><br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">CC-NC-PNC 143.514 0,59% 2 (.57%/.62%) 2 (.57%/.61%) 2 (.57%/.60%) 2 (.50%/.61%)</span><br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">COMPROMÍS-Q 125.150 0,51% 1 (.29%/.54%) 1 (.29%/.53%) 2 (.57%/.53%) 1 (.25%/.53%)</span><br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">FAC 99.173 0,40% 1 (.29%/.43%) 1 (.29%/.42%) 1 (.29%/.42%) 1 (.25%/.42%)</span><br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">GBAI 42.411 0,17% 1 (.29%/.18%) 1 (.29%/.18%) 1 (.29%/.18%) 1 (.25%/.18%)</span><br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">EQUO 215.750 0,88% 0 (---------) 3 (.86%/.92%) 1 (.29%/.91%) 0 (---------)</span><br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">PACMA 101.546 0,41% 0 (---------) 1 (.29%/.43%) 1 (.29%/.43%) 0 (---------)</span><br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">Eb 97.685 0,40% 0 (---------) 1 (.29%/.41%) 1 (.29%/.41%) 0 (---------)</span><br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">PA 76.842 0,31% 0 (---------) 0 (---------) 1 (.29%/.32%) 0 (---------)</span><br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">PxC 59.778 0,24% 0 (---------) 0 (---------) 1 (.29%/.25%) 0 (---------)</span><br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">P.R.C. 43.903 0,18% 0 (---------) 0 (---------) 1 (.29%/.18%) 0 (---------)</span><br />
<br />
<br />
<br />
El "mètode noruec" es tracta en afegir uns quants diputats (jo n'he afegit 50, per arribar als 400 que la constitució deixa que hi hagi) i distribuir-lo via llei Sainte-Laguë en circumscripció única.<br />
<br />
Un anàlisi profund indica que<br />
<br />
<ol><li>El sistema actual és una mofa. El % de vot respecte el % d'escons està desproporcionadament distant.</li>
<li>La diferència entre la llei d'Homt i la Sainte-Laguë no és tan profunda com sembla a la teoria. La única diferència pràctica és qui arrodoneix "cap amunt" i qui "cap avall". De fet, només PP i PSOE perden escons, i tampoc en perden gaires (7 en total).</li>
<li>El "mètode noruec" equilibra però no és la panacea. És qüestió de proporció, a més pes de la llista general, més equilibra. Jo ho he fet amb un 12%. Noruega ho fan al 22%. Pujant fins a 450 diputats la cosa comença a semblar decent, i amb 500 diputats (30% de llista general) la cosa queda ja força bé (entra el PACMA i escons en blanc). Comptant que he afegit 150 diputats i eliminant els 264 del senat (una cambra que no serveix per a res) es guanya un sistema força més equitatiu, amb menys necessitat de "vot útil" (el teu vot acaba anant a algun lloc, encara que no surti a la teva província).</li>
</ol><div>P.S.: Taula amb els 450/500 diputats, mètode noruec.</div><br />
<br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"></span><br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"> partits vots % vots resultats noruega 450 noruega 500</span><br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">PP 10.830.035 44,62% 186 (53.%/47.%) 233 (52.%/46.%) 255 (51.%/46.%)</span><br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">PSOE 6.973.351 28,73% 110 (31.%/30.%) 140 (31.%/30.%) 154 (30.%/30.%)</span><br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">CiU 1.013.979 4,17% 16 (4.6%/4.4%) 20 (4.4%/4.3%) 22 (4.4%/4.3%)</span><br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">IU-LV 1.680.639 6,92% 11 (3.1%/7.3%) 18 (4.0%/7.2%) 22 (4.4%/7.1%)</span><br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">AMAIUR 333.628 1,37% 7 (2.0%/1.4%) 8 (1.8%/1.4%) 9 (1.8%/1.4%)</span><br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">UPyD 1.140.116 4,69% 5 (1.4%/4.9%) 10 (2.2%/4.9%) 12 (2.4%/4.8%)</span><br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">EAJ-PNV 323.517 1,33% 5 (1.4%/1.4%) 6 (1.3%/1.4%) 7 (1.4%/1.4%)</span><br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">ESQUERRA 256.304 1,05% 3 (.86%/1.1%) 4 (.89%/1.1%) 5 (1.0%/1.1%)</span><br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">BNG 183.279 0,75% 2 (.57%/.79%) 3 (.67%/.78%) 3 (.60%/.78%)</span><br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">CC-NC-PNC 143.514 0,59% 2 (.57%/.62%) 3 (.67%/.61%) 3 (.60%/.61%)</span><br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">COMPROMÍS-Q 125.150 0,51% 1 (.29%/.54%) 2 (.44%/.54%) 2 (.40%/.53%)</span><br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">FAC 99.173 0,40% 1 (.29%/.43%) 1 (.22%/.42%) 2 (.40%/.42%)</span><br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">GBAI 42.411 0,17% 1 (.29%/.18%) 1 (.22%/.18%) 1 (.20%/.18%)</span><br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">EQUO 215.750 0,88% 0 (---------) 1 (.22%/.92%) 1 (.20%/.92%)</span><br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">PACMA 101.546 0,41% 0 (---------) 0 (---------) 1 (.20%/.43%)</span><br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">Eb 97.685 0,40% 0 (---------) 0 (---------) 1 (.20%/.41%)</span><br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">PA 76.842 0,31% 0 (---------) 0 (---------) 0 (---------)</span><br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">PxC 59.778 0,24% 0 (---------) 0 (---------) 0 (---------)</span><br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">P.R.C. 43.903 0,18% 0 (---------) 0 (---------) 0 (---------)</span><br />
<br />
<br />
En aquest cas, els únics partits que realment podria considerar el resultat com un atracament son UPyD i IU. PA i PxC també es podrien queixar, doncs tenint més d'un 0.2%, no tenen cap diputat.<br />
<br />
P.P.S.: He fet un re-pensament i he tornat a calcular els resultats segons el métode norueg "repassat". Abans, repartia els 50 escons "contant des de zero", ara ho faig tenint en compte els resultats anteriors i dóna un parlament molt decent. (Últimes columnes)<br />
<br />
<br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"> partit vots %vots actuals noruega ben fet</span><br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">PP 10.830.035 44,62% 186 (53.%/47.%) 186 (46.5%/46.6%) +0</span><br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">PSOE 6.973.351 28,73% 110 (31.%/30.%) 114 (28.5%/29.3%) +4</span><br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">CiU 1.013.979 4,17% 16 (4.6%/4.4%) 17 (4.25%/4.27%) +1</span><br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">IU-LV 1.680.639 6,92% 11 (3.1%/7.3%) 27 (6.75%/7.08%) +16</span><br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">AMAIUR 333.628 1,37% 7 (2.0%/1.4%) 7 (1.75%/1.41%) +0</span><br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">UPyD 1.140.116 4,69% 5 (1.4%/4.9%) 19 (4.75%/4.80%) +14</span><br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">EAJ-PNV 323.517 1,33% 5 (1.4%/1.4%) 5 (1.25%/1.36%) +0</span><br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">ESQUERRA 256.304 1,05% 3 (.86%/1.1%) 4 (1.00%/1.08%) +1</span><br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">BNG 183.279 0,75% 2 (.57%/.79%) 3 (.750%/.772%) +1</span><br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">CC-NC-PNC 143.514 0,59% 2 (.57%/.62%) 2 (.500%/.605%) +0</span><br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">COMPROMÍS-Q 125.150 0,51% 1 (.29%/.54%) 2 (.500%/.527%) +1</span><br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">FAC 99.173 0,40% 1 (.29%/.43%) 2 (.500%/.418%) +1</span><br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">GBAI 42.411 0,17% 1 (.29%/.18%) 1 (.250%/.179%) +0</span><br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">EQUO 215.750 0,88% 0 (---------) 4 (1.00%/.909%) +3</span><br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">PACMA 101.546 0,41% 0 (---------) 2 (.500%/.428%) +2</span><br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">Eb 97.685 0,40% 0 (---------) 2 (.500%/.411%) +2</span><br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">PA 76.842 0,31% 0 (---------) 1 (.250%/.324%) +1</span><br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">PxC 59.778 0,24% 0 (---------) 1 (.250%/.252%) +1</span><br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">P.R.C. 43.903 0,18% 0 (---------) 1 (.250%/.185%) +1</span><br />
<br />
Nota final: M'han comentat de mirar com serien les eleccions segons el métode <a href="http://en.wikipedia.org/wiki/Single_transferable_vote">STV</a>. He decidit no fer-ho per una senzilla raó: STV suposa llistes obertes, i el vot seria completament diferent.<br />
<br />
<span class="Apple-style-span" style="font-size: large;"><b>La meva proposta.</b></span><br />
<br />
De moment, i sense ser massa revolucionari.<br />
<br />
<br />
<ol><li>Llistes desbloquejades (com a mínim)</li>
<li>Eliminaria el senat (no serveix per a res) i pujaria el congrés fins a 400 membres (el màxim que permet la constitució).</li>
<li>Actualment es donen 2 diputats per província, i la resta, fins arribar als 350, es reparteixen segons la població. Això ho deixaria més o menys igual, afegint uns diputats "de reforç" (que anirien abans dels suplents) repartits amb els 50 que falten.</li>
<li>Els 350 primers diputats s'escollirien mitjançant el mateix sistema que fins ara, els 50 que queden es repartirien mitjançant la llei de Sainte-Languë, en circumscripció única i contant els 350 primers com si ja s'haguéssin escollit.</li>
<li>Quan un partit polític guanya un diputat d'aquests 50 extres, aquest surt de la llista d'una província. La província s'escull també amb la llei Sainte-Languë entre les llistes d'aquest partit de cada província, contant els escons ja trets en cada una d'elles. Això afavoreix tenir més representativitat a les províncies amb més participació, i acostuma a equilibrar el "pes" dels votants. (Els diputats "de reforç" són per cobrir aquests llocs).</li>
</ol><div>Per posar uns exemples, CiU i ERC haguessin guanyat un diputat extra a Barcelona, UPyD, els 14 que guanyaria serien: 1 a Alacant, 1 a Barcelona, 1 a Cádiz, 1 a Granada, 4 a Madrid, 1 a Màlaga, 1 a Múrcia, 1 a Sevilla, 1 a València, 1 a Valladolid i 1 a Zaragoza. EQUO 3 a Madrid i 1 a les Balears.</div>Isaac "Atridas" Serranohttp://www.blogger.com/profile/10992118315015501330noreply@blogger.com0tag:blogger.com,1999:blog-6619682241934117489.post-14233735226705050572011-11-14T21:05:00.000+01:002011-11-14T21:05:53.224+01:00Crear un motor 3D Multiplataforma - Motor Antagonista [ I ]Bones.<br />
<br />
Començo el meu "diatari" sobre com vaig fent un motor multiplataforma (Linux i Windows i, opcionalment, Android i, opcionalíssimament, iOs).<br />
<br />
Aquest motor serà bàsicament una reescriptura del motor que hem fet al màster (mirar entrada anterior), però "ben fet" (no és que digui que el motor que hem fet està mal fet [fet, fet, fet, parèntesi, parèntesi, parèntesi], sinó que, al anar aprenent no teníem la visió de conjunt necessària per fer certes coses, que ara si que tinc).<br />
<br />
En aquest projecte em proposo diverses coses, entre elles aprendre C++11 (la raó principal per la que no faci el joc en Java) i distreure'm mentre no trobi feina.<br />
<br />
Els objectius principals seran tenir la mateixa funcionalitat que al master, més la capacitat de ser multiplataforma (i alguna millora gràfica gràcies a no dependre del DirectX, visca OpenGL!!).<br />
<br />
<br />
<ul><li>Interfície amb el sistema operatius via SDL 1.3 (té llicència ZLib, la qual em permet fer-ne el que em doni la santa gana).</li>
<li>Gràfics 2D via SDL o OpenGL (ES?).</li>
<li>Gràfics 3D via OpenGL amb diferents perfils "intercanviables".</li>
<ul><li>Perfil bàsic: 1.5 o ES 1.1</li>
<li>Perfil normal: 2.0</li>
<li>Perfil avançat: 4.2 (3.3? Qui el vol?)</li>
</ul><li>Configuració amb fitxers YAML</li>
<li>Scripting via LUA (no he aconseguit fer funcionar Boost::Python, ja que té un memory leak gros com ell sol, així que tornem al lua).</li>
<li>So via SDL (amb l'ajuda del mixer per llegir "ogg"s. Bass costa 2.700€, així que queda descartat.</li>
<li>Física via Bullet (si hi ha temps per fer-la). Sé que n'hi ha d'altres, però ja estic una mica familiaritzat amb Bullet, així que no hi ha d'haver masses problemes al respecte.</li>
<li>DCCs Blender i Gimp.</li>
<li>D'animacions m'agradaria crear el meu pròpi sistema, però sempre hi ha Cal3D allà per si no me'n surto.</li>
</ul><div>No sé si m'he deixat res, però és igual.</div><div><br />
</div><div>Com a eines uso Mercurial com a control de versions (és distribuit i mola lo suficient) i Eclipse com a IDE.</div><div><br />
</div><div>De moment simplement m'he creat una carpeta a l'Ubuntu controlada amb el Hg (mercurial) de nom "Motor Antagonista" i a dintre hi aniré creant els diferents projectes de l'Eclipse.</div><div><br />
</div><div>Començo per el base.</div><div><br />
</div><div>Nou projecte -> C++ Static Library -> Toolchain "Cross GCC"</div><div><br />
</div><div>A partir d'aqui el primer que faig és retocar les configuracions (botó dret sobre el projecte, propietats al final de tot). Dintre de "C/C++ Build" -> Settings et deixa mirar les configuracions. Per defecte n'hi ha 2: "debug" i "release"; els hi canvio el nom per "GNU|Linux Debug" i "GNU|Linux Release" (per després crear les configuracions corresponents per windows) i n'afegeixo una de nova "Production" (cópia de Release) a Release li engego les opcions de debug (així que queda optimitzada a tope i amb debug, sent una build "intermitja"). També defineixo els símbols "_DEBUG" (per la build de debug) i "NDEBUG" (per la resta), per si de cas. Tot això s'ha de afegir 2 vegades, una a la configuració del "gcc" i l'altra a la del "g++" (les 2 són a "Settings", on he dit abans). Finalment, i per totes les configuracions, afegeixo la opció "-std=c++0x" a la línea de comandes de "g++" per que em compili amb les coses del C++11 (bé, amb les coses "provisionals", ja que encara no tinc la versió de gcc que compila C++11 correctament).</div><br />
<br />
<br />
Després de fer tot això, em dedico a afegir llibreries.<br />
<br />
Creo una carpeta "include" i a dintre i foto tots els arxius de "GLI"[0.3.0.3] i "GLM"[0.9.2.7], trets de <a href="http://www.g-truc.net/">http://www.g-truc.net/</a> (nota: els 2 tenen un "dummy.cpp" que cal esborrar, aquestes llibreries són "només capçaleres" i per tant relativament fàcils de incloure | nota2: GLI té un memory leak. No és molt preocupant i ja he avisat de la seva existència i l'autor diu que a la pròxima versió estarà corregit).<br />
<br />
Afegeixo també els includes de "yaml-cpp" i creo una carpeta nova "lib/GNULinux" on hi afegeixo la llibreria estàtica (libyaml-cpp.a). Faig el mateix amb les llibreries de LUA (5.1), de SDL (1.3) i Luabind (0.9.1)** (aquestes embruten considerablement la carpeta "include", espero que això no em passi factura després)*.<br />
<br />
Una bona estona me la passo fent "./config; make; make install;", per cert (a veure en windows com ho faig tot això).<br />
<br />
Afegeixo per acabar "<a href="http://sourceforge.net/projects/nvwa/">http://sourceforge.net/projects/nvwa/</a>" i GLEW. Finalment faig una carpeta anomenada "Licences" on vaig copiant totes les llicències per tenir-les controlades.<br />
<br />
I de moment això és tot. Després intentaré configurar el Mercurial correctament.<br />
<br />
*: Per lua, només cal "lua.h" "lua.hpp" "luaconf.h" "lualib.h" i "lauxlib.h"<br />
**: Per al luabind... és més fàcil passar de "bjam"s i limitar-se a copiar tot el codi a dintre del projecte.Isaac "Atridas" Serranohttp://www.blogger.com/profile/10992118315015501330noreply@blogger.com0tag:blogger.com,1999:blog-6619682241934117489.post-86869870463137833822011-11-14T18:57:00.000+01:002011-11-14T18:57:01.026+01:00Final de màster.Bé, ja he acabat el màster en creació de videojocs. Feia temps que no em passava per aqui i tinc alguna cosa a apuntar.<br />
<br />
De fet, he interromput el que estava fent per escriure aquesta petita entrada, doncs vui tenir els videos del joc ben localitzables.<br />
<br />
<iframe allowfullscreen="" frameborder="0" height="315" src="http://www.youtube.com/embed/kXjVPWsFg-Y" width="560"></iframe><br />
<br />
<iframe allowfullscreen="" frameborder="0" height="315" src="http://www.youtube.com/embed/uEqUZX1jXRw" width="560"></iframe><br />
<br />
<iframe allowfullscreen="" frameborder="0" height="315" src="http://www.youtube.com/embed/7MuSneK1t98" width="560"></iframe><br />
<br />
Bé, ha estat un llarg trajecte que ha comportat mooooooolta feina. El resultat final és, com no, millorable, però n'estic força satisfet.<br />
<br />
Ja sóc un Ni-ni, a veure quan duro així.Isaac "Atridas" Serranohttp://www.blogger.com/profile/10992118315015501330noreply@blogger.com0tag:blogger.com,1999:blog-6619682241934117489.post-461415930038425022011-05-29T22:24:00.003+02:002011-05-30T13:12:05.662+02:00Una de pollosos i gossosSeré polèmic, que és el que toca.<br />
<br />
<a href="https://www.asopol.org/2011/05/sobre-la-carga-de-los-mossos-desquadra-en-plaza-cataluna/%20">https://www.asopol.org/2011/05/sobre-la-carga-de-los-mossos-desquadra-en-plaza-cataluna/ </a><br />
<br />
<a href="http://thelede.blogs.nytimes.com/2011/05/27/police-clash-with-protesters-in-barcelona/?ref=world">http://thelede.blogs.nytimes.com/2011/05/27/police-clash-with-protesters-in-barcelona/?ref=world</a><br />
<br />
Un link és de la policia, i l'altre del NY Times, on veureu uns quans vídeos. Llegiu el primer i mireu (després) els videos, si no els heu vist ja.<br />
<br />
Primer de tot una introducció sobre mi per qui no em conegui. Sóc (quasi) enginyer informàtic, i des de l'octubre sóc membre del Partit Pirata Català (Anomenat "Pirates de Catalunya" per que ja existia un "Partit Pirata" espanyol i no ens hi podiem dir sense formar part d'ells rollo PSC). Aquest partit defensa molts dels punts que han anat sortint a les acampades i que n'han estat causa, tot i que no tots. Per fer-vos una idea, un amic meu ha escrit el següent text sobre les demandes dels acampats:<br />
<br />
<a href="https://docs.google.com/document/d/1nNplofoR06TTPYqJzY69cUHcnJR3lSsEyRms1Z6lQtY/edit?hl=en_US">https://docs.google.com/document/d/1nNplofoR06TTPYqJzY69cUHcnJR3lSsEyRms1Z6lQtY/edit?hl=en_US</a><br />
<br />
Hi estic majoritàriament d'acord amb l'Aleix (l'autor dels comentaris) però ràpidament dic que posaria més emfasis a que els diners no plouen del cel i un estat amb "més de tot" és desitjable però difícil, i que toca moltes vegades prioritzar, cosa que els acampats no fan en cap moment, simplement demanen una sobreprotecció total de l'estat, i això en opinió meva acava sent negatiu (és, segons crec jo, un dels grans fracassos dels estats comunistes: la falta d'ambició individual dels seus habitants fa que el sistema no pugui aguantar-se a ell mateix). Tampoc parlaré molt d'aquest tema, que demanaria un post en si mateix.<br />
<br />
Estava parlant de Pirates de Catalunya. Una de les coses boniques d'aquest partit és de demana democracia directa (que no participativa) i pretén aconseguir-ho usant les eines que, afortunadament, ens dóna el nostre país, que hem de recordar, les té i afortunadament no és pas cap dictadura (després hi torno). Per veure un exemple de com funciona el partit per dintre, a part de mirar la seva web pirata.cat podeu mirar el link que poso a continuació, que és on es discuteix una desició (també es discuteixen coses per les llistes de correu):<br />
<br />
<a href="https://xifrat.pirata.cat/ideatorrent/idea/107">https://xifrat.pirata.cat/ideatorrent/idea/107</a><br />
<br />
<br />
Molt bé, hem parlat que jo no estic en contra del que demanen els acampats. Al menys no en contra de tot, i que concretament també penso que el nostre estat democràtic té certes mancances que, sobretot ara la tecnologia i la informació global, ens poden permetre superar via democràcia directa.<br />
<br />
Fins hi tot puc entendre que acampin, cosa il·legal, però ara diré el que més llenya em farà caura.<br />
<br />
ETA també demana (o demanava) coses "correctes" (la independència d'euskadi, concretament), i feia servir métodes ilícits per aconseguir-ho.<br />
<br />
És extremadament obvi que no es pot comparar matar persones amb acampar a una plaça. La diferéncia de gravetat dels dos fets els situa a ordres de magnitud de distància. I tot i així, les dos coses són demanar coses via métodes ilegals. Està clar, doncs, que és un tema d'on podem el llistor, i això no sempre és fàcil Si diem que matar està clarament fora, i ocupar un espai públic està dintre, què hi ha al mig i on marquem la barrera? Sé que em cauràn osties per haver-ho dit, però com a mínim feu-vos la pregunta.<br />
<br />
Ara, sobre les càrregues policials. Havent llegit el text de la policia (també tenen dret a defensar-se) queden clar els motius de la càrrega policial: van demanar als indignats que s'apartessin del mig, i ells no ho van fer, i els policies van haver de recórrer a la violència per treure'ls. Assumirem (que és molt assumir) que realment el que venien a fer les brigades de neteja era correcte (seria: endur-se bombones de butà, eines de l'hort i coses perilloses en general; netejar de pixum la plaça, etc... NO seria: endur-se portàtils i apunts de les assamblees, com també van fer). I que, per tant, la feina de la policia era també correcte: garantir que els primers puguin fer la seva feina en condicions i seguretat.<br />
<br />
Si assumim el què he dit a dalt (que hi podem discutir, i ja he dit que té matissos), aleshores arribem a un punt: impedir que les brigades de neteja facin la seva feina era (1) incorrecte i (2) buscar-se problemes amb la policia. Arribat a aquest punt era, doncs, feina de la policia, apartar als indignats del mig. Fins aquí, i si s'hagues pogut apartar-los del mig sense violència, crec que estariem tots d'acord. Per tant el problema sembla ser si la policia ha de, o pot, fer servir la violència en aquests casos.<br />
<br />
I aqui us vui comentar un punt molt interessant, al meu parer, i és que, en el mateix comentari de l'associació professional de policies (que he enllaçat més amunt) comenta que la violència era el métode "protocolari" de resoldre la situació (gent que ocupa l'espai públic, desobeeix per activa i passiva les ordres d'un agent policial, i que guanya en nombre a aquest), però que caldria buscar una altra manera menys violenta i "espectacular" (en paraules seves) de resoldre-la. I no podria estar més d'acord. Ho remarco per que no vui que ningú oblidi que els agents que eren allà feien la seva feina, malaguanyada aquell dia però que segurament si et roben a la rambla i després t'ajuden els hi donaràs les gràcies, i que no disposaven de mitjans (o coneixements) per resoldre-la d'una altra manera.<br />
<br />
És correcte emprar la violència? Segurament no. Mai? Ningú s'ha ficat en una baralla per res? Qui estigui lliure de culpa que tiri la primera pedra.<br />
<br />
El que vui resumir aqui, no és si la càrrega policial va ser correcte o incorrecte. Si l'ocupació de plaça catalunya, un espai de tots, és correcte o incorrecte. El que m'agradaria transmetre, és que no tot és blanc o negre, ni és tant fàcil de dir: No, que la policia usi la violència contra gent que ha petat les rodes dels camions de les escombraries, i que no obeeixen per les bones, és dolent.<br />
<br />
És molt fàcil dir que la policia va actuar de forma violenta, com animals, i oblidar que dos no es barallen si un no vol, i que si els manifestants haguéssin volgut haguéssin evitat tot l'espectacle. Però clar (i aqui si que em surt la meva vena anti-pollòs) si no estàs a fabor seu, estàs en contra seu.<br />
<br />
I aquesta és la trampa que jo, i algún amic meu, hem caigut: expressar públicament que els indignats no tenen la raó absoluta i que, la policia "només" va fer la seva feina. Fent això la gent ens agafa per feixistes, o alguna cosa similar, per molt que pensem que la violència no és la solució i que el problema hagués estat millor resolt d'una altra manera.<br />
<br />
Però sabeu què? Fins ara, ningú m'ha dit una altra solució que no sigui "la policia i els camions de la neteja haurien d'haver marxat". Mireu, aquesta solució és igual a "els manifestants haurien d'haver agafat les seves coses, apartar-se, deixar fer la seva feina a BCNeta i després tornar". És un problema de a veure qui cedeix i qui té raó. El que jo vui és que algú em proposi una solució pacífica intermitja.<br />
<br />
P.S.: Finalment, sobre el títol del post, és per deixar clar que estic més en contra de les 2 parts que a fabor de cap d'elles. Concretament, crec que els objectius d'ambdós són generalment bons, però els métodes no ho són tant (matissos en tots els casos).Isaac "Atridas" Serranohttp://www.blogger.com/profile/10992118315015501330noreply@blogger.com0tag:blogger.com,1999:blog-6619682241934117489.post-78822478499965418572011-02-05T19:30:00.003+01:002011-02-05T19:57:53.246+01:00Suficiència d'OpenGL ES 2.0 Part II (Framebuffers)Continuant el post anterior, i una mica en la mateixa línea, avordem un tema "important", sobretot si es tracta de fer efectes abançats: Els Framebuffers.<br />
<br />
D'acord, primer de tot, necessitem entendre una mica de teoria sobre on dibuixem les coses i quins espais de memòria ens són disponibles.<br />
<br />
Aquests espais de memòria als que em refereixo són els buffers de renderització; allà on guardem informació de color, profunditat, etc... En l'exemple més senzill de OpenGL, disposem de 2 buffers: el front buffer i el back buffer. Aquests buffers guarden informació de color (RGB i a vegades un Alpha que indica "quantitat d'opacitat"), el front buffer es mostra per pantalla mentre que el backbuffer és on dibuixem. Un cop acavem de dibuixar un frame, intercanviem el front i el back, així no es veu mai "mentre dibuixem" sinó que veiem sempre dibuixos sencers.<br />
<br />
Addicionalment se li poden afegir 2 buffers: el depth buffer i el stencil buffer. Sobre l'stencil no en parlarè gaire, per no dir gens; mai l'he fet servir i no sé ben bé per a què serveix, però el depth buffer és molt útil. Aquest búffer de profunditat (depth) guarda la profunditat on se suposa que cada pixel està pintat. Això ens permet un mètode senzill per renderitzar les coses que estàn més a prop: si anem a dibuixar una cosa més llunyana que la que hi ha dibuixada, no la dibuixem. Si és més propera, la dibuixem i actualitzem el depth.<br />
<br />
Molt bé, ara veiem que per renderitzar necessitem un buffer de color i, opcionalment, un de profunditat i/o un de stencil. Per defecte normalment en tenim un de cada (més el front buffer), però a vegades ens interessa dibuixar coses "fora de la pantalla". Per exemple: Imaginem-nos que estem en un joc, en una sala amb càmeres de videovigilància. Aquestes càmeres mostren, en temps real, altres habitacions. Per a acomplir aquest efecte, podem renderitzar aquestes altres habitacions en una textura cada una i, posteriorment, renderitzar la textura a la càmera.<br />
<br />
Això és el que es coneix com a off-screen rendering, i consisteix en crear un "Framebuffer object", que és una col·lecció de buffers de distínta índole, i dir-li a l'openGL que renderitzi sobre aquest. Els buffer poden ser de 2 maneres: o bé una textura, o bé un Renderbuffer. La diferència essencial és que no tenim fàcilment accessible la informació dels Renderbuffers, mentre que una textura la tenim sempre a mà.<br />
<br />
Codi:<br />
<div style="color: #38761d; font-family: "Courier New",Courier,monospace;"><br />
</div><span style="color: #38761d; font-family: "Courier New",Courier,monospace;">//------------------------------------------------------------</span><br />
<div style="color: #38761d; font-family: "Courier New",Courier,monospace;"><br />
</div><div style="color: #38761d; font-family: "Courier New",Courier,monospace;">//Primer creem els Renderbuffers, que poden servir com a color,</div><div style="color: #38761d; font-family: "Courier New",Courier,monospace;">//profunditat o stencil</div><div style="font-family: "Courier New",Courier,monospace;">GLuint renderbuffers[2];</div><div style="font-family: "Courier New",Courier,monospace;">glGenRenderbuffers(2, &(renderbuffers[0]));</div><div style="font-family: "Courier New",Courier,monospace;"><br />
</div><div style="color: #38761d; font-family: "Courier New",Courier,monospace;">//activem el renderbuffer</div><div style="font-family: "Courier New",Courier,monospace;">glBindRenderbuffer(GL_RENDERBUFFER, renderbuffers[0]);</div><div style="font-family: "Courier New",Courier,monospace;"><br />
</div><div style="color: #38761d; font-family: "Courier New",Courier,monospace;">//definim com és el renderbuffer</div><div style="font-family: "Courier New",Courier,monospace;">glRenderbufferStorage(GL_RENDERBUFFER,</div><div style="font-family: "Courier New",Courier,monospace;"> format, <span style="color: #38761d;">//Format intern</span></div><div style="font-family: "Courier New",Courier,monospace;"> width, height); <span style="color: #38761d;">//dimensions</span></div><div style="color: #38761d; font-family: "Courier New",Courier,monospace;"><br />
</div><div style="color: #38761d; font-family: "Courier New",Courier,monospace;">// Formats estàndard:</div><div style="color: #38761d; font-family: "Courier New",Courier,monospace;">// GL_RGB565, GL_RGBA4, GL_RGB5_A1, <span style="color: #0b5394;">-- Color</span></div><div style="color: #38761d; font-family: "Courier New",Courier,monospace;">// GL_DEPTH_COMPONENT16, GL_STENCIL_INDEX8</div><div style="color: #38761d; font-family: "Courier New",Courier,monospace;">//</div><div style="color: #38761d; font-family: "Courier New",Courier,monospace;">// Formats amb l'extensió GL_OES_rgb8_rgba8</div><div style="color: #38761d; font-family: "Courier New",Courier,monospace;">// GL_RGB8_OES, GL_RGBA8_OES</div><div style="color: #38761d; font-family: "Courier New",Courier,monospace;">// </div><div style="color: #38761d; font-family: "Courier New",Courier,monospace;">// Formats amb l'extensió GL_OES_depth24 / GL_OES_depth32</div><div style="color: #38761d; font-family: "Courier New",Courier,monospace;">// GL_DEPTH_COMPONENT24_OES, GL_DEPTH_COMPONENT32_OES</div><div style="color: #38761d; font-family: "Courier New",Courier,monospace;">//</div><div style="color: #38761d; font-family: "Courier New",Courier,monospace;">// Formats amb l'extensió GL_OES_stencil1 / GL_OES_stencil4</div><div style="color: #38761d; font-family: "Courier New",Courier,monospace;">// GL_STENCIL_INDEX1, GL_STENCIL_INDEX4</div><div style="color: #38761d; font-family: "Courier New",Courier,monospace;">//</div><div style="color: #38761d; font-family: "Courier New",Courier,monospace;">// Formats amb l'extensió GL_OES_packed_depth_stencil</div><div style="color: #38761d; font-family: "Courier New",Courier,monospace;">// GL_DEPTH24_STENCIL8_OES</div><div style="color: #38761d; font-family: "Courier New",Courier,monospace;"><br />
</div><div style="color: #38761d; font-family: "Courier New",Courier,monospace;">// Les dimensions cal que siguin iguals o menors a</div><div style="color: #38761d; font-family: "Courier New",Courier,monospace;">// GL_MAX_RENDERBUFFER_SIZE</div><div style="font-family: "Courier New",Courier,monospace;"> </div><div style="font-family: "Courier New",Courier,monospace;">glBindRenderbuffer(GL_RENDERBUFFER, renderbuffers[0]);</div><div style="font-family: "Courier New",Courier,monospace;">glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA4, 800, 600);</div><div style="font-family: "Courier New",Courier,monospace;">glBindRenderbuffer(GL_RENDERBUFFER, renderbuffers[1]);</div><div style="font-family: "Courier New",Courier,monospace;">glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, 800, 600);</div><div style="font-family: "Courier New",Courier,monospace;"><br />
</div><div style="font-family: "Courier New",Courier,monospace;"><br />
</div><div style="font-family: "Courier New",Courier,monospace;"></div><div style="font-family: "Courier New",Courier,monospace;"><br />
</div><div style="color: #38761d; font-family: "Courier New",Courier,monospace;">//Crear identificadors de frambuffer,</div><div style="color: #38761d; font-family: "Courier New",Courier,monospace;">// de forma similar a les textures:</div><div style="font-family: "Courier New",Courier,monospace;">GLuint framebufferID;</div><div style="font-family: "Courier New",Courier,monospace;">glGenFramebuffers(1, <span style="color: #38761d;">//nombre d'id a generar</span></div><div style="font-family: "Courier New",Courier,monospace;"> &framebufferID);</div><div style="font-family: "Courier New",Courier,monospace;"><br />
</div><div style="color: #38761d; font-family: "Courier New",Courier,monospace;">// Activar el framebuffer</div><div style="font-family: "Courier New",Courier,monospace;">glBindFramebuffer(GL_FRAMEBUFFER, framebufferID);</div><div style="font-family: "Courier New",Courier,monospace;"><br />
</div><div style="color: #38761d; font-family: "Courier New",Courier,monospace;">// Aquesta funció ens serveix tant per especificar les propietats</div><div style="color: #38761d; font-family: "Courier New",Courier,monospace;">//del framebuffer (punts d'anclatge) com per indicar que volem</div><div style="color: #38761d; font-family: "Courier New",Courier,monospace;">//que es renderitzi a aquest. Per tornar a renderitzar als buffer</div><div style="color: #38761d; font-family: "Courier New",Courier,monospace;">//"normals" hem de fer:</div><div style="font-family: "Courier New",Courier,monospace;">glBindFramebuffer(GL_FRAMEBUFFER, 0);</div><div style="font-family: "Courier New",Courier,monospace;"><br />
</div><div style="font-family: "Courier New",Courier,monospace;"><span style="color: #38761d;">// Lligar un renderbuffer al framebuffer </span></div><div style="font-family: "Courier New",Courier,monospace;">gl_FramebufferRenderbuffer(GL_FRAMEBUFFER,</div><div style="font-family: "Courier New",Courier,monospace;"> punt_d_anclatge,</div><div style="font-family: "Courier New",Courier,monospace;"> GL_RENDERBUFFER,</div><div style="font-family: "Courier New",Courier,monospace;"> renderbufferID); <span style="color: #38761d;">//0 per no anclar-hi res</span></div><div style="color: #38761d; font-family: "Courier New",Courier,monospace;"><br />
</div><div style="color: #38761d; font-family: "Courier New",Courier,monospace;">// Punts d'anclatge:</div><div style="color: #38761d; font-family: "Courier New",Courier,monospace;">// GL_COLOR_ATTACHMENT0, GL_DEPTH_ATTACHMENT, GL_STENCIL_ATTACHMENT</div><div style="color: #38761d; font-family: "Courier New",Courier,monospace;">// Com a nota important, saber que en OpenGL estàndard hi ha més</div><div style="color: #38761d; font-family: "Courier New",Courier,monospace;">//punts d'anclatge, concretament, els de color 1, 2, 3... Això </div><div style="color: #38761d; font-family: "Courier New",Courier,monospace;">//serveix per poder pintar a més d'un lloc a la vegada, i ho </div><div style="color: #38761d; font-family: "Courier New",Courier,monospace;">//explicarè als fragment shaders.</div><div style="color: #38761d; font-family: "Courier New",Courier,monospace;"><br />
</div><div style="color: #38761d; font-family: "Courier New",Courier,monospace;">//Continuant amb l'exemple </div><div style="font-family: "Courier New",Courier,monospace;">gl_FramebufferRenderbuffer(GL_FRAMEBUFFER,</div><div style="font-family: "Courier New",Courier,monospace;"> GL_COLOR_ATTACHMENT0,</div><div style="font-family: "Courier New",Courier,monospace;"> GL_RENDERBUFFER,</div><div style="font-family: "Courier New",Courier,monospace;"> renderbuffers[0]);</div><div style="font-family: "Courier New",Courier,monospace;">gl_FramebufferRenderbuffer(GL_FRAMEBUFFER,</div><div style="font-family: "Courier New",Courier,monospace;"> GL_DEPTH_ATTACHMENT,</div><div style="font-family: "Courier New",Courier,monospace;"> GL_RENDERBUFFER,</div><div style="font-family: "Courier New",Courier,monospace;"> renderbuffers[1]);</div><div style="font-family: "Courier New",Courier,monospace;">gl_FramebufferRenderbuffer(GL_FRAMEBUFFER,</div><div style="font-family: "Courier New",Courier,monospace;"> GL_STENCIL_ATTACHMENT,</div><div style="font-family: "Courier New",Courier,monospace;"> GL_RENDERBUFFER,</div><div style="font-family: "Courier New",Courier,monospace;"> 0);</div><div style="font-family: "Courier New",Courier,monospace;"><br />
</div><div style="color: #38761d; font-family: "Courier New",Courier,monospace;">//Comprovar errors</div><div style="font-family: "Courier New",Courier,monospace;">GLenum result = glCheckFramebufferStatus(GL_FRAMEBUFFER);</div><div style="font-family: "Courier New",Courier,monospace;"><br />
</div><div style="color: #38761d; font-family: "Courier New",Courier,monospace;">//Result pot ser:</div><div style="color: #38761d; font-family: "Courier New",Courier,monospace;">// GL_FRAMEBUFFER_COMPLETE <span style="color: #0b5394;">-- OK</span> </div><div style="color: #38761d; font-family: "Courier New",Courier,monospace;">// GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT <span style="color: #0b5394;">-- Algun error</span></div><div style="color: #38761d; font-family: "Courier New",Courier,monospace;"><span style="color: #0b5394;">// -- en algun anclatge.</span></div><div style="color: #38761d; font-family: "Courier New",Courier,monospace;">// GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT <span style="color: #0b5394;">-- No hi ha cap</span></div><div style="color: #38761d; font-family: "Courier New",Courier,monospace;"><span style="color: #0b5394;">// --anclatge</span></div><div style="color: #38761d; font-family: "Courier New",Courier,monospace;">// GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS <span style="color: #0b5394;">-- Anclatges amb</span></div><div style="color: #38761d; font-family: "Courier New",Courier,monospace;"><span style="color: #0b5394;">// -- dimensions diferents</span></div><div style="color: #38761d; font-family: "Courier New",Courier,monospace;">// GL_FRAMEBUFFER_INCOMPLETE_FORMATS <span style="color: #0b5394;">-- Algun format no suportat</span></div><div style="color: #38761d; font-family: "Courier New",Courier,monospace;">// GL_FRAMEBUFFER_UNSUPPORTED <span style="color: #0b5394;">-- Combinació d'anclatges i formats</span></div><div style="color: #38761d; font-family: "Courier New",Courier,monospace;">// <span style="color: #0b5394;">-- no suportats.</span></div><div style="color: #38761d; font-family: "Courier New",Courier,monospace;"><br />
</div><div style="color: #38761d; font-family: "Courier New",Courier,monospace;"><br />
</div><div style="color: #38761d; font-family: "Courier New",Courier,monospace;">// Com s'ha dit anteriorment, la gràcia de tot plegat és la de</div><div style="color: #38761d; font-family: "Courier New",Courier,monospace;">//dibuixar a una textura, per això anclem una textura al </div><div style="color: #38761d; font-family: "Courier New",Courier,monospace;">//framebuffer com ho anclavem un renderbuffer</div><div style="font-family: "Courier New",Courier,monospace;">glFramebufferTexture2D(GL_FRAMEBUFFER,</div><div style="font-family: "Courier New",Courier,monospace;"> punt_d_anclatge, <span style="color: #38761d;">//Només color o profunditat</span></div><div style="font-family: "Courier New",Courier,monospace;"> target,</div><div style="font-family: "Courier New",Courier,monospace;"> texture_id, </div><div style="font-family: "Courier New",Courier,monospace;"> 0); <span style="color: #38761d;">//nivell mipmap.</span></div><div style="font-family: "Courier New",Courier,monospace;"><br />
</div><div style="color: #38761d; font-family: "Courier New",Courier,monospace;">// Targets:</div><div style="color: #38761d; font-family: "Courier New",Courier,monospace;">// GL_TEXTURE_2D, GL_TEXTURE_CUBE_MAP_POSITIVE_X, ...</div><div style="color: #38761d; font-family: "Courier New",Courier,monospace;"><br />
</div><div style="color: #38761d; font-family: "Courier New",Courier,monospace;">//EXTRA: Textures 3D</div><div style="font-family: "Courier New",Courier,monospace;">glFramebufferTexture3DOES(GL_FRAMEBUFFER,</div><div style="font-family: "Courier New",Courier,monospace;"> GL_COLOR_ATTACHMENT0, <span style="color: #38761d;">//No depth</span></div><div style="font-family: "Courier New",Courier,monospace;"> GL_TEXTURE_3D_OES,</div><div style="font-family: "Courier New",Courier,monospace;"> texture_id,</div><div style="font-family: "Courier New",Courier,monospace;"> 0, <span style="color: #38761d;">//nivell mipmap.</span></div><div style="font-family: "Courier New",Courier,monospace;"> z_offset); <span style="color: #38761d;">//profunditat</span></div><div style="color: #38761d; font-family: "Courier New",Courier,monospace;"><br />
</div><div style="color: #38761d; font-family: "Courier New",Courier,monospace;">// Finalment i nogensmenys important:</div><div style="font-family: "Courier New",Courier,monospace;">glDeleteRenderbuffers(2, &(renderbuffers[0])); <span style="color: #38761d;">//La pots liar si </span></div><div style="font-family: "Courier New",Courier,monospace;"><span style="color: #38761d;"> //encara està en ús en un framebuffer</span></div><div style="font-family: "Courier New",Courier,monospace;">glDeleteFramebuffers(1, &framebufferID); </div><div style="font-family: "Courier New",Courier,monospace;"><br />
</div><div style="color: #38761d; font-family: "Courier New",Courier,monospace;"></div><div style="color: #38761d; font-family: "Courier New",Courier,monospace;">//------------------------------------------------------------</div><br />
<br />
Per altra banda, i de manera molt ràpida, m'agradaria introduir una altra funcionalitat molt similar, encara que amb un rendiment més baix (tot i que a vegades necessitem fer-la servir en front de framebuffers). Aquesta és simplement copiar el contingut de l'actual framebuffer (el back buffer en cas de no tenir un framebuffer activat) a una textura.<br />
<br />
<br />
<span style="color: #38761d; font-family: "Courier New",Courier,monospace;">//------------------------------------------------------------</span><br />
<div style="font-family: "Courier New",Courier,monospace;">glCopyTexImage2D(target, <span style="color: #38761d;">// GL_TEXTURE_2D, GL_TEXTURE_CUBE...</span></div><div style="font-family: "Courier New",Courier,monospace;"> 0, <span style="color: #38761d;">// nivell mipmap </span></div><div style="font-family: "Courier New",Courier,monospace;"> texture_format,</div><div style="font-family: "Courier New",Courier,monospace;"> x, y, <span style="color: #38761d;">// On de la pantalla comencem a copiar</span></div><div style="font-family: "Courier New",Courier,monospace;"> w, h, <span style="color: #38761d;">// tamany de la textura / àrea a copiar</span></div><div style="font-family: "Courier New",Courier,monospace;"> 0); <span style="color: #38761d;">// border</span></div><div style="color: #38761d; font-family: "Courier New",Courier,monospace;"><br />
</div><div style="color: #38761d; font-family: "Courier New",Courier,monospace;">// El format pot ser</div><div style="color: #38761d; font-family: "Courier New",Courier,monospace;">// GL_RGBA, GL_RGB, GL_LUMINANCE, GL_LUMINANCE_ALPHA, GL_ALPHA</div><div style="color: #38761d; font-family: "Courier New",Courier,monospace;">// A més, en OpenGL estàndard (MAI en ES) es pot copiar el depth</div><div style="color: #38761d; font-family: "Courier New",Courier,monospace;">// buffer si s'especifica el format </div><div style="color: #38761d; font-family: "Courier New",Courier,monospace;">// GL_DEPTH_COMPONENT</div><div style="font-family: "Courier New",Courier,monospace;"><br />
</div><div style="font-family: "Courier New",Courier,monospace;"><br />
</div><div style="color: #38761d; font-family: "Courier New",Courier,monospace;">// Per copiar a una subregió d'una textura </div><div style="font-family: "Courier New",Courier,monospace;">glCopyTexSubImage2D(target, 0, texture_format,</div><div style="font-family: "Courier New",Courier,monospace;"> xoffset, <span style="color: #38761d;">// coordenades on començar a copiar</span></div><div style="font-family: "Courier New",Courier,monospace;"> yoffset, <span style="color: #38761d;">// a la textura</span></div><div style="font-family: "Courier New",Courier,monospace;"> x, y, w, h, 0);</div><div style="font-family: "Courier New",Courier,monospace;"><br />
</div><div style="color: #38761d; font-family: "Courier New",Courier,monospace;">// Les 3D només poden fer servir la "SubImage"</div><div style="font-family: "Courier New",Courier,monospace;">glCopyTexSubImage3DOES(target, 0, texture_format, </div><div style="font-family: "Courier New",Courier,monospace;"> xoffset, yoffset,</div><div style="font-family: "Courier New",Courier,monospace;"> zoffset, <span style="color: #38761d;">// coordenada z a on es copia</span></div><div style="font-family: "Courier New",Courier,monospace;"> x, y, w, h, 0);</div><div style="font-family: "Courier New",Courier,monospace;"></div><div style="color: #38761d; font-family: "Courier New",Courier,monospace;">//------------------------------------------------------------</div><br />
I fins aqui tots els temes relacionats amb renderitzar múltiples vegades un frame. Amb això es poden aconseguir efectes xulos, ja sigui:<br />
Glow, Blur, HDR, Ombres (Shadowmap)...Isaac "Atridas" Serranohttp://www.blogger.com/profile/10992118315015501330noreply@blogger.com0tag:blogger.com,1999:blog-6619682241934117489.post-86236296640743759202011-01-28T17:55:00.001+01:002011-01-28T20:17:03.007+01:00Guia ràpida d'OpenGL (ES)Molts bons el que sigui.<br />
<br />
He estat llegint un llibre d'<b>OpenGL ES 2.0</b>, la versió per sistemes integrats d'<b>OpenGL</b>. La gràcia (explicat ràpidament) de la versió <b>ES</b> és que és essencialment el mateix que la versió "mare" però simplificada, o sigui, amb totes les funcions "redundants" eliminades. Un programa fet doncs, en <b>OpenGL ES</b> és pràcticament un 100% portable a <b>OpenGL</b> normal (excepte que les extensions són diferens, petits detallets).<br />
<br />
Què vui fer jo ara? Escriure'm un resumet del llibre, ja que l'he de tornar a la biblioteca eventualment.<br />
<br />
Així que, què, saveu com va <b>OpenGL</b>, més o menys? El de veritat, el dels Shaders, eh!<br />
<br />
Essencialment, el que un ha de fer perque es dibuixi alguna cosa és especificar un seguit de geometria (Triangles, línees o "punts"), que recorre un seguit de transformacions fins que són pintades. Quines transformacions?<br />
<br />
<span style="font-size: x-large;">Pipeline:</span><br />
<ol><li><b>Vertex Shader</b>: Agafa paràmetres que li dónes directament i les passes a la següent fase. El paràmetre important a passar són les coordenades de "clip" (coordenades de retallada), que essencialment són les coordenades dels vertexos normalitzades.</li>
<li><b>Rasterització</b>: Es divideix en diferents fases, l'objectiu és trobar els fragments que faràn el "Fragment Shader.</li>
<ol><li><b>Divisió de perspectiva</b>: S'agafen les coordenades de clip <b>(xc, yc, zc, wc)</b> i es transformen a coordenades de Device <b>(xd, </b><b>yd, </b><b>zd)</b> = <b>(xc/wc, yc/wc, zc/wc)</b>. Aquelles coordenades fóra del rang [-1, 1] són descartades.</li>
<li><b>Transformació de Viewport</b>: Transforma les anteriors coordenades a coordenades de pantalla (les x i y) i també transforma proporcionalment les z a un rang que tu mateix has especificat.</li>
<li><b>Rasterització</b>: Un cop tens cada vèrtex situat en un pixel, "s'envien" tots els pixels intermitjos al <b>Fragment Shader</b>. Prèviament es fa el culling (Eliminar els triangles que estiguin mirant en contra la càmera.</li>
</ol><li><b>Fragment Shader</b>: Agafa paràmetres interpolats del <b>Vertex Shader</b> i els utilitza per definir el color del fragment. A més disposa de les coordenades del fragment en pantalla, les coordenades dels point-sprites, i si la cara mira o no a càmera.</li>
<li><b>Operacions per fragment</b>: També n'hi ha vàries.</li>
<ol><li><b>Scissor Testing</b>: Fa que només es pintin pixels definits en un rectangle definit.</li>
<li><b>Stencil Test</b>: No ho he entès mai, ni mai he vist cap exemple de ningú fent-ho servir.</li>
<li><b>Depth Test</b>: Decideix si un fragment es dibuixa o no segons la seva profunditat.</li>
<li><b>Blending</b>: Barreja el color amb el color anterior.</li>
<li><b>Dithering</b>: Tampoc ho he fet servir mai.</li>
</ol></ol><span style="font-size: x-large;">Coses Ràpides que cal saber de shaders:</span><br />
<br />
Els Shaders tenen 3 tipus de "variables globals":<br />
<ul><li><b>Uniform</b>: Són paràmetres que comparteix tota la geometria, on la geometria és allò que dibuixes d'un cop, un model, vamos. Exemples serien les matrius de transformació, les llums, etc...</li>
<li><b>Attribute</b>: Són paràmetres per vèrtex. Per exemple Coordenades-Objecte, Normals, coordenades de textura i altres.</li>
<li><b>Varying</b>: Aquestes s'escriuen al <b>Vertex Shader</b> i es llegeixen al <b>Fragment Shader</b>. És la manera de passar informació de l'una a l'altre.</li>
</ul>Cada shader es defineix amb una funció "main" de tota la vida.<br />
<br />
Com es creen els shaders? "Fàcil"!<br />
<br />
Primer cal crear ambdós shaders:<br />
<br />
<br />
<div style="color: #38761d;"><span style="font-family: "Courier New",Courier,monospace;">//---------------------------------------------------------</span></div><div style="font-family: "Courier New",Courier,monospace;">GLenum type; <span style="color: #38761d;">//GL_VERTEX_SHADER | GL_FRAGMENT_SHADER</span></div><div style="font-family: "Courier New",Courier,monospace;"><br />
</div><div style="font-family: "Courier New",Courier,monospace;">GLuint shader_object = glCreateShader(type);</div><div style="font-family: "Courier New",Courier,monospace;"><br />
</div><div style="font-family: "Courier New",Courier,monospace;">glShaderSource( shader_object, </div><div style="font-family: "Courier New",Courier,monospace;"> count, <span style="color: #38761d;">// número d'strings que passes</span></div><div style="font-family: "Courier New",Courier,monospace;"> strings, <span style="color: #38761d;">// array de char*, amb el codi</span></div><div style="font-family: "Courier New",Courier,monospace;"> lenghts);<span style="color: #38761d;">// array de int, amb la llargada de cada</span></div><div style="color: #38761d; font-family: "Courier New",Courier,monospace;"> // string. Si és NULL se suposa que</div><div style="color: #38761d; font-family: "Courier New",Courier,monospace;"> // acaven en '\0'. Si un element és</div><div style="color: #38761d; font-family: "Courier New",Courier,monospace;"> // negatiu se suposa que aquell acava</div><div style="color: #38761d; font-family: "Courier New",Courier,monospace;"> // en '\0'.</div><div style="font-family: "Courier New",Courier,monospace;"><br />
</div><div style="font-family: "Courier New",Courier,monospace;">glCompileShader( shader_object );</div><div style="font-family: "Courier New",Courier,monospace;"></div><div style="font-family: "Courier New",Courier,monospace;">glGetShaderiv( shader_object,</div><div style="font-family: "Courier New",Courier,monospace;"> param, <span style="color: #38761d;">// GL_COMPILE_STATUS </span></div><div style="color: #38761d; font-family: "Courier New",Courier,monospace;"> // GL_DELETE_STATUS</div><div style="color: #38761d; font-family: "Courier New",Courier,monospace;"> // GL_INFO_LOG_LENGTH</div><div style="color: #38761d; font-family: "Courier New",Courier,monospace;"> // GL_SHADER_SOURCE_STATUS</div><div style="color: #38761d; font-family: "Courier New",Courier,monospace;"> // GL_SHADER_TYPE</div><div style="font-family: "Courier New",Courier,monospace;"> &result);</div><div style="font-family: "Courier New",Courier,monospace;"><br />
</div><div style="color: #38761d; font-family: "Courier New",Courier,monospace;">//Comprovar que el compile status sigui true, sino agafar el log</div><div style="font-family: "Courier New",Courier,monospace;">if(!result) {<br />
int len; <br />
glGetShaderiv( shader_object, GL_INFO_LOG_LENGTH, len);<br />
<br />
char* infoLog = new char[len];</div><div style="font-family: "Courier New",Courier,monospace;"> glGetShaderInfoLog(shader_object,<br />
len,<br />
NULL, <span style="color: #38761d;">//llargada, com que ja la savem, null</span><br />
infoLog);<br />
<br />
printf("Log: %s", infoLog);</div><div style="font-family: "Courier New",Courier,monospace;">}</div><div style="font-family: "Courier New",Courier,monospace;"><br />
</div><div style="color: #38761d; font-family: "Courier New",Courier,monospace;">//Eventualment</div><div style="font-family: "Courier New",Courier,monospace;">glDeleteShader(shader_object); </div><div style="color: #38761d;"><span style="font-family: "Courier New",Courier,monospace;">//---------------------------------------------------------</span></div><br />
Un cop creats els shaders (Vertex i Fragment), cal lligar-los:<br />
<br />
<div style="color: #38761d;"><span style="font-family: "Courier New",Courier,monospace;">//---------------------------------------------------------</span></div><div style="color: #38761d;"><span style="color: black; font-family: "Courier New",Courier,monospace;">GLuint vertex_shader, fragment_shader;</span></div><div style="color: #38761d;"><br />
</div><div style="color: #38761d;"><span style="color: black; font-family: "Courier New",Courier,monospace;">GLuint shader_program = glCreateProgram();</span></div><div style="color: #38761d;"><span style="color: black; font-family: "Courier New",Courier,monospace;"><br />
</span></div><div style="color: #38761d;"><span style="color: black; font-family: "Courier New",Courier,monospace;">glAttachShader(</span><span style="color: black; font-family: "Courier New",Courier,monospace;">shader_program, </span><span style="color: black; font-family: "Courier New",Courier,monospace;">vertex_shader);</span></div><div style="color: #38761d;"><span style="color: black; font-family: "Courier New",Courier,monospace;">glAttachShader(</span><span style="color: black; font-family: "Courier New",Courier,monospace;"></span><span style="color: black; font-family: "Courier New",Courier,monospace;">shader</span><span style="color: black; font-family: "Courier New",Courier,monospace;">_program, </span><span style="color: black; font-family: "Courier New",Courier,monospace;"></span><span style="color: black; font-family: "Courier New",Courier,monospace;">fragment</span><span style="color: black; font-family: "Courier New",Courier,monospace;"></span><span style="color: black; font-family: "Courier New",Courier,monospace;">_shader);</span></div><div style="color: #38761d;"><br />
</div><div style="color: #38761d;"><span style="font-family: "Courier New",Courier,monospace;">//glDetachShader( ... )</span></div><div style="color: #38761d;"><span style="color: black; font-family: "Courier New",Courier,monospace;"> </span></div><div style="color: #38761d;"><span style="color: black; font-family: "Courier New",Courier,monospace;">glLinkProgram(shader_program); //Fer el link de les "coses"</span></div><div style="color: #38761d;"><span style="color: black; font-family: "Courier New",Courier,monospace;"><br />
</span></div><div style="color: #38761d;"><span style="font-family: "Courier New",Courier,monospace;">//glValidateProgram</span><span style="font-family: "Courier New",Courier,monospace;">(shader_program)</span><span style="font-family: "Courier New",Courier,monospace;"> serveix per validar i agafar</span></div><div style="color: #38761d;"><span style="font-family: "Courier New",Courier,monospace;">//info per el log, però és lent i només s'ha d'usar per "debugar"</span></div><div style="color: #38761d;"><span style="font-family: "Courier New",Courier,monospace;">//i buscar errors.</span></div><div style="color: #38761d;"><span style="color: black; font-family: "Courier New",Courier,monospace;"><br />
</span></div><div style="color: #38761d;"><span style="color: black; font-family: "Courier New",Courier,monospace;">glProgramiv( ... ); </span></div><div style="color: #38761d;"><span style="font-family: "Courier New",Courier,monospace;">//similar al de shader objects, amb paràmetres</span><span style="font-family: "Courier New",Courier,monospace;"></span> </div><div style="color: #38761d;"><span style="font-family: "Courier New",Courier,monospace;">//GL_ACTIVE_ATTRIBUTES --nombre d'atributs</span></div><div style="color: #38761d;"><span style="font-family: "Courier New",Courier,monospace;">//GL_ACTIVE_ATTRIBUTES_MAX_LENGTH --len de l'atribut més llarg</span></div><span style="color: #38761d; font-family: "Courier New",Courier,monospace;"></span> <br />
<div style="color: #38761d;"><span style="font-family: "Courier New",Courier,monospace;">//GL_ACTIVE_UNIFORMS -- "</span></div><div style="color: #38761d;"><span style="font-family: "Courier New",Courier,monospace;">//GL_ACTIVE_UNIFORMS_MAX_LENGTH -- "</span></div><div style="color: #38761d;"><span style="font-family: "Courier New",Courier,monospace;">//GL_ATTACHED_SHADERS -- nombre de shaders afegits</span></div><div style="color: #38761d;"><span style="font-family: "Courier New",Courier,monospace;">//GL_DELETE_STATUS -- si es vol eliminar</span></div><div style="color: #38761d;"><span style="font-family: "Courier New",Courier,monospace;">//GL_INFO_LOG_LENGHT --</span></div><div style="color: #38761d;"><span style="font-family: "Courier New",Courier,monospace;">//GL_LINK_STATUS -- si s'ha linkad bé</span></div><div style="color: #38761d;"><span style="font-family: "Courier New",Courier,monospace;">//GL_VALIDATE_STATUS -- si ha validat</span></div><div style="color: #38761d;"><span style="color: black; font-family: "Courier New",Courier,monospace;"><br />
</span></div><div style="color: #38761d;"><span style="color: black; font-family: "Courier New",Courier,monospace;">glGetProgramInfoLog( ... ); <span style="color: #38761d;">// com el dels objectes.</span></span></div><div style="color: #38761d;"><span style="color: black; font-family: "Courier New",Courier,monospace;"><br />
</span></div><div style="color: #38761d;"><span style="font-family: "Courier New",Courier,monospace;">//Eventualment</span></div><div style="color: #38761d;"><span style="color: black; font-family: "Courier New",Courier,monospace;">glDeleteProgram( shader_program );</span></div><div style="color: #38761d;"><span style="color: black; font-family: "Courier New",Courier,monospace;"> </span></div><div style="color: #38761d;"><span style="font-family: "Courier New",Courier,monospace;">//---------------------------------------------------------</span></div><br />
Un cop tenim els shaders compilats i tot, cal agafar les localitzacions dels "uniforms". Amb les localitzacions serem capaços d'escriure aquests valors. "Passar-los" al shader.<br />
<br />
Hi ha una funció, glGetActiveUniform, que serveix per saber quina "uniform" hi ha en cada posició i quin tipus té, però aquesta no és la manera normal de buscar-ho (ja sabem quines "uniform" hi ha en el shader, l'hem escrit nosaltres!).<br />
<br />
<span style="font-family: "Courier New",Courier,monospace;">GLint uniformLocation = glGetUniformLocation( shader_program, "nom_uniform");</span><br />
<br />
Així tenim la localització, que podem fer servir així:<br />
<br />
<div style="font-family: "Courier New",Courier,monospace;">void glUniform1f(GLint location, GLfloat v0);</div><br />
Coses a tenir en compte: Per fer-ho servir el shader ha d'estar "actiu" (més, després) i tmb que n'hi ha moltes, de funcions, i es troben a <a href="http://www.opengl.org/sdk/docs/man/xhtml/glUniform.xml">[1]</a>.<br />
<br />
Els atributs s'agafen de manera similar.<br />
<br />
<span style="font-family: "Courier New",Courier,monospace;">GLint attributeLocation = glGetAttributeLocation( shader_program, "nom_attribute");</span><br />
<br />
<span style="font-size: x-large;">Com preparar la "Geometria"</span><br />
<br />
No m'estaré de métodes arcaics per definir geometria i aniré directament al métode més "eficient".<br />
<br />
Conceptualment es tracta de pujar a memória VRAM, memòria de la targeta gràfica, totes les dades necessàries per dibuixar la geometria, i posteriorment cridar-la quan calgui. L'algoritme vé a ser el següent:<br />
<ol><li>En una fase de "init", definir i omplir els buffers.</li>
<li>En una fase de "render":</li>
<ol><li>Activar el Shader que s'utilitza ( <span style="font-family: "Courier New",Courier,monospace;">glUseProgram(program_id);</span> ).</li>
<li>Definir totes les Uniforms que fa servir el Shader</li>
<li>Fer la crida de "Pinta la geometria".</li>
</ol><li>En una fase de "cleanup" eliminar els buffers.</li>
</ol>Què són i com funcionen els buffers? Imaginem-nos que volem renderitzar el següent cuadrat:<br />
<br />
<div style="font-family: "Courier New",Courier,monospace;">[0] ----- [1]</div><div style="font-family: "Courier New",Courier,monospace;"> | |</div><div style="font-family: "Courier New",Courier,monospace;"> | |</div><div style="font-family: "Courier New",Courier,monospace;"> | |</div><div style="font-family: "Courier New",Courier,monospace;">[2] ----- [3] </div><br />
Aquest té 4 vertexos, amb coordenades [0 => (0, 5, 0)], [1 => (5, 5, 0)], [2 => (0, 0, 0)], [3 => (5, 0, 0)], i amb coordenades de textura [0 => (0, 1)], [1 => (1, 1)], [2 => (0, 0)], [3 => (1, 0)]. Podríem fer un array de la següent manera:<br />
<br />
<div style="font-family: "Courier New",Courier,monospace;">float vertex_data[] = {0, 5, 0, 0, 1, //primer vertex</div><div style="font-family: "Courier New",Courier,monospace;"> 5, 5, 0, 1, 1,</div><div style="font-family: "Courier New",Courier,monospace;"> 0, 0, 0, 0, 0,</div><div style="font-family: "Courier New",Courier,monospace;"> 5, 0, 0, 1, 0 //últim vertex</div><div style="font-family: "Courier New",Courier,monospace;"> };</div><br />
Per indicar com s'ha de dibuixar, es pot fer indexat. Primer de tot, cal dividir la geometria en triangles, podem fer 2 triangles en aquest cas: el {0, 2, 1} i el {1, 2, 3}. Així li podem indicar a OpenGL que dibuixi la geometria {0, 2, 1, 1, 2, 3}.<br />
<br />
<div style="font-family: "Courier New",Courier,monospace;">uint16 index_data[] = {0, 2, 1, 1, 2, 3};</div><br />
Abdós buffers es poden guardar a VRAM i posteriorment activar i utilitzar.<br />
<br />
<span style="font-size: large;">Creant Buffers</span><br />
<br />
Aqui expliquem com crear els buffers, o sigui, la part de "init"<br />
<br />
<br />
<span style="color: #38761d; font-family: "Courier New",Courier,monospace;">//----------------------------------------------------------</span><br />
<div style="font-family: "Courier New",Courier,monospace;">GLuint bufferIds[2];</div><div style="font-family: "Courier New",Courier,monospace;"><br />
</div><div style="font-family: "Courier New",Courier,monospace;">glGenBufferData(2, bufferIds); <span style="color: #38761d;">//Generem 2 buffers</span></div><div style="font-family: "Courier New",Courier,monospace;"><br />
</div><div style="font-family: "Courier New",Courier,monospace;">glBindBuffer(GL_ARRAY_BUFFER, bufferIds[0]); <span style="color: #38761d;">//activem el buffer</span></div><div style="color: #38761d; font-family: "Courier New",Courier,monospace;"> //com a buffer de</div><div style="color: #38761d; font-family: "Courier New",Courier,monospace;"> //dades</div><div style="font-family: "Courier New",Courier,monospace;">glBufferData(GL_ARRAY_BUFFER, </div><div style="font-family: "Courier New",Courier,monospace;"> numVert * sizeVert, <span style="color: #38761d;">//Tamany que tindran les dades</span></div><div style="font-family: "Courier New",Courier,monospace;"> vertex_data, <span style="color: #38761d;">//Dades</span></div><div style="font-family: "Courier New",Courier,monospace;"> GL_STATIC_DRAW); <span style="color: #38761d;">//Mode. Li dóna pistes a la gràfica</span></div><div style="color: #38761d; font-family: "Courier New",Courier,monospace;"> //GL_STATIC_DRAW -- escrit 1, usat molt</div><div style="color: #38761d; font-family: "Courier New",Courier,monospace;"> //GL_DYNAMIC_DRAW -- escrit molt, usat molt</div><div style="font-family: "Courier New",Courier,monospace;"><span style="color: #38761d;"> //GL_STREAM_DRAW -- escrit 1, usat poc</span></div><div style="font-family: "Courier New",Courier,monospace;"><br />
</div><div style="font-family: "Courier New",Courier,monospace;"> <span style="color: #38761d;">//GL_ELEMENT... serveix per indexos</span></div><div style="font-family: "Courier New",Courier,monospace;">glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, bufferIds[1]);</div><div style="font-family: "Courier New",Courier,monospace;">glBufferData(GL_ELEMENT_ARRAY_BUFFER, size, index_data, GL_STATIC_DRAW); </div><div style="font-family: "Courier New",Courier,monospace;"><br />
</div><span style="color: #38761d; font-family: "Courier New",Courier,monospace;">//----------------------------------------------------------</span> <br />
Com a nota adicional, sempre es pot re-crear les dades amb "glBufferData" o canviar una part amb "glBufferSubData" (tot i que si l'has creat amb "STATIC_DRAW" puteges al driver).<br />
<br />
<span style="font-size: large;">Emprant Buffers</span><br />
<br />
Aqui expliquem com renderitzar usant buffers, o sigui la crida a "pintar geometria".<br />
<br />
<br />
<div style="color: #38761d;"><span style="font-family: "Courier New",Courier,monospace;">//-------------------------------------------------------------</span></div><br />
<span style="font-family: "Courier New",Courier,monospace;"><span style="color: #38761d;"> //Activem el buffer de vertexos que farem servir </span></span><br />
<div style="font-family: "Courier New",Courier,monospace;">glBindBuffer(GL_ARRAY_BUFFER, vertexBufferId);</div><div style="font-family: "Courier New",Courier,monospace;"><br />
</div><div style="font-family: "Courier New",Courier,monospace;"><span style="font-family: "Courier New",Courier,monospace;"></span></div><span style="font-family: "Courier New",Courier,monospace;"><span style="color: #38761d;"> //Activem el buffer d'indexos que farem servir </span></span><br />
<div style="font-family: "Courier New",Courier,monospace;">glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vertexBufferId);</div><div style="font-family: "Courier New",Courier,monospace;"><br />
</div><div style="font-family: "Courier New",Courier,monospace;"><br />
</div><div style="color: #38761d; font-family: "Courier New",Courier,monospace;"> //activem els atributs del shader </div><div style="font-family: "Courier New",Courier,monospace;">glEnableVertexAttribArray(position_attrib); </div><div style="font-family: "Courier New",Courier,monospace;">glEnableVertexAttribArray(texcoord_attrib); </div><br />
<span style="font-family: "Courier New",Courier,monospace;">glVertexAttribPointer(position_attrib, <span style="color: #38761d;">// atribut que usem</span></span><br />
<span style="font-family: "Courier New",Courier,monospace;"> 3, <span style="color: #38761d;">//nº de dades a l'atribut</span></span><br />
<span style="font-family: "Courier New",Courier,monospace;"> GL_FLOAT, <span style="color: #38761d;">//tipus de dades</span></span><br />
<span style="font-family: "Courier New",Courier,monospace;"> GL_FALSE, <span style="color: #38761d;">//normalització</span></span><br />
<span style="font-family: "Courier New",Courier,monospace;"> vtxStride, <span style="color: #38761d;">//distancia entre un vtx</span></span><br />
<span style="font-family: "Courier New",Courier,monospace;"><span style="color: #38761d;"> // i el següent</span></span><br />
<span style="font-family: "Courier New",Courier,monospace;"> 0); <span style="color: #38761d;">//distancia entre l'inici del</span></span><br />
<div style="color: #38761d;"><span style="font-family: "Courier New",Courier,monospace;"> // vtx i les dades en qüestió. </span></div><div style="color: #38761d;"><br />
</div><div style="color: #38761d;"><span style="font-family: "Courier New",Courier,monospace;"> /**********************************************************\</span></div><div style="color: #38761d;"><span style="font-family: "Courier New",Courier,monospace;"> * Sobre la normalització, serveix per quan usem un tipus *</span></div><div style="color: #38761d;"><span style="font-family: "Courier New",Courier,monospace;"> * de dades diferent a float i volem que al passar-les a *</span></div><div style="color: #38761d;"><span style="font-family: "Courier New",Courier,monospace;"> * float OpenGL les transformi al rang [-1, 1] o no. *</span></div><div style="color: #38761d;"><span style="font-family: "Courier New",Courier,monospace;"> \**********************************************************/</span></div><div style="color: #38761d;"><br />
</div><div style="color: #38761d;"><span style="font-family: "Courier New",Courier,monospace;"> /**********************************************************\</span></div><div style="color: #38761d;"><span style="font-family: "Courier New",Courier,monospace;"> * Sobre els tipus de dades, poden ser GL_BYTE, *</span></div><div style="color: #38761d;"><span style="font-family: "Courier New",Courier,monospace;"> * GL_UNSIGNED_BYTE, GL_SHORT, GL_UNSIGNED_SHORT, GL_FIXED, *</span></div><div style="color: #38761d;"><span style="font-family: "Courier New",Courier,monospace;"> * GL_FLOAT, GL_HALF_FLOAT_OES/GL_HALF_FLOAT_ARB *</span></div><div style="color: #38761d;"><span style="font-family: "Courier New",Courier,monospace;"> \**********************************************************/</span></div><br />
<span style="font-family: "Courier New",Courier,monospace;">gl</span><span style="font-family: "Courier New",Courier,monospace;">VertexAttribPointer(texcoord_attrib,<br />
</span><br />
<span style="font-family: "Courier New",Courier,monospace;"> 2, </span><br />
<span style="font-family: "Courier New",Courier,monospace;"> GL_FLOAT, <br />
</span><br />
<span style="font-family: "Courier New",Courier,monospace;"> GL_FALSE, <br />
</span><br />
<span style="font-family: "Courier New",Courier,monospace;"> vtxStride, </span><br />
<span style="font-family: "Courier New",Courier,monospace;"> sizeof(float)*3);</span><br />
<br />
<span style="font-family: "Courier New",Courier,monospace;">glDrawElements(GL_TRIANGLES, <span style="color: #38761d;">//Tipus de primitiva</span></span><br />
<span style="font-family: "Courier New",Courier,monospace;"> 6, <span style="color: #38761d;">//nº de indexos</span></span><br />
<span style="font-family: "Courier New",Courier,monospace;"> GL_UNSIGNED_SHORT, <span style="color: #38761d;">//tipus de dades</span></span><br />
<span style="font-family: "Courier New",Courier,monospace;"> 0); <span style="color: #38761d;">//distància entre l'inici del </span></span><br />
<div style="color: #38761d;"><span style="font-family: "Courier New",Courier,monospace;"> // buffer i el primer index. </span></div><div style="color: #38761d;"><span style="font-family: "Courier New",Courier,monospace;"><br />
</span></div><div style="color: #38761d;"><span style="font-family: "Courier New",Courier,monospace;">// Tipus de primitives:</span></div><div style="color: #38761d;"><span style="font-family: "Courier New",Courier,monospace;">//GL_POINTS, GL_LINES, GL_LINE_STRIP, GL_LINE_LOOP,</span></div><div style="color: #38761d;"><span style="font-family: "Courier New",Courier,monospace;">//GL_TRIANGLES, GL_TRIANGLE_STRIP, GL_TRIANGLE_FAN</span></div><div style="color: #38761d;"><span style="font-family: "Courier New",Courier,monospace;"><br />
</span></div><div style="color: #38761d;"><span style="font-family: "Courier New",Courier,monospace;">// Tipus de dades als indexos</span></div><div style="color: #38761d;"><span style="font-family: "Courier New",Courier,monospace;">//GL_UNSIGNED_BYTE, GL_UNSIGNED_SHORT, GL_UNSIGNED_INT</span></div><span style="font-family: "Courier New",Courier,monospace;"><span style="color: #38761d;">//La darrera necessita de l'extensió OES_element_index_uint</span></span><br />
<span style="font-family: "Courier New",Courier,monospace;"> </span><br />
<div style="font-family: "Courier New",Courier,monospace;">glDisableVertexAttribArray(position_attrib); </div><div style="font-family: "Courier New",Courier,monospace;">glDisableVertexAttribArray(texcoord_attrib); </div><div style="color: #38761d;"><span style="font-family: "Courier New",Courier,monospace;">//-------------------------------------------------------------</span></div><br />
<span style="font-size: x-large;">Textures:</span><br />
<br />
Les textures en OpenGL sempre han estat un petit percal. No m'extendré massa, però coses "importants":<br />
<br />
<br />
<span style="color: #38761d; font-family: "Courier New",Courier,monospace;">//----------------------------------------------</span><br />
<div style="font-family: "Courier New",Courier,monospace;">glGenTextures(num, &id); <span style="color: #38761d;">//genera textures</span></div><div style="font-family: "Courier New",Courier,monospace;">glDeleteTextures(num, &id); <span style="color: #38761d;">//ejem</span></div><div style="color: #38761d; font-family: "Courier New",Courier,monospace;"><br />
</div><div style="font-family: "Courier New",Courier,monospace;"><span style="color: #38761d;"> //Activar textura</span></div><div style="font-family: "Courier New",Courier,monospace;">glBindTexture(tipus,<span style="color: #38761d;"> //GL_TEXTURE_2D, GL_TEXTURE_CUBE_MAP</span></div><div style="font-family: "Courier New",Courier,monospace;"> id);</div><div style="font-family: "Courier New",Courier,monospace;"><br />
</div><div style="font-family: "Courier New",Courier,monospace;"> //Definir la informació</div><div style="font-family: "Courier New",Courier,monospace;">glTexImage(capa,</div><div style="font-family: "Courier New",Courier,monospace;"> nivell, <span style="color: #38761d;">//Nivell de mipmap. Deixeu-lo a 0</span></div><div style="font-family: "Courier New",Courier,monospace;"> internalFormat, <span style="color: #38761d;">//format intern</span></div><div style="font-family: "Courier New",Courier,monospace;"> width, </div><div style="font-family: "Courier New",Courier,monospace;"> height,</div><div style="font-family: "Courier New",Courier,monospace;"> border, <span style="color: #38761d;">//en OpenGL ES, 0.</span></div><div style="font-family: "Courier New",Courier,monospace;"> externalFormat, <span style="color: #38761d;">//cal que sigui el mateix que l'intern.</span></div><div style="font-family: "Courier New",Courier,monospace;"> dataType, <span style="color: #38761d;">//tipus de dades</span></div><div style="font-family: "Courier New",Courier,monospace;"> data); <span style="color: #38761d;">//dades, per "files"</span></div><div style="font-family: "Courier New",Courier,monospace;"><br />
</div><div style="color: #38761d; font-family: "Courier New",Courier,monospace;">// Capa:</div><div style="color: #38761d; font-family: "Courier New",Courier,monospace;">// Per textures 2D, GL_TEXTURE_2D</div><div style="color: #38761d; font-family: "Courier New",Courier,monospace;">// Per Cubemap s'han de definir totes 6 cares:</div><div style="color: #38761d; font-family: "Courier New",Courier,monospace;">// GL_TEXTURE_CUBE_MAP_POSITIVE_X, ...NEGATIVE_X, ...</div><div style="color: #38761d; font-family: "Courier New",Courier,monospace;"><br />
</div><div style="color: #38761d; font-family: "Courier New",Courier,monospace;">// Formats:</div><div style="color: #38761d; font-family: "Courier New",Courier,monospace;">//GL_RGBA, GL_RGB, GL_LUMINANCE_ALPHA, GL_LUMINANCE, GL_ALPHA</div><div style="color: #38761d; font-family: "Courier New",Courier,monospace;">//Pensar en la luminance com a "escala de grisos"</div><div style="color: #38761d; font-family: "Courier New",Courier,monospace;"><br />
</div><div style="color: #38761d; font-family: "Courier New",Courier,monospace;">// Tipus de dades:</div><div style="color: #38761d; font-family: "Courier New",Courier,monospace;">//GL_UNSIGNED_BYTE, GL_UNSIGNED_SHORT_4_4_4_4,</div><div style="color: #38761d; font-family: "Courier New",Courier,monospace;">//GL_UNSIGNED_SHORT_5_5_5_1, GL_UNSIGNED_SHORT_5_6_5 </div><div style="color: #38761d; font-family: "Courier New",Courier,monospace;"><br />
</div><div style="font-family: "Courier New",Courier,monospace;"><span style="color: #38761d;"> //Definir com es filtra la imatge quan es fa més gran.</span></div><div style="font-family: "Courier New",Courier,monospace;">glTexParameteri( tipus,</div><div style="font-family: "Courier New",Courier,monospace;"> GL_TEXTURE_MAG_FILTER,</div><div style="font-family: "Courier New",Courier,monospace;"> param); <span style="color: #38761d;">//GL_NEAREST / GL_LINEAR</span></div><div style="font-family: "Courier New",Courier,monospace;"><br />
</div><div style="font-family: "Courier New",Courier,monospace;"> <span style="color: #38761d;">//Definir com es filtra la imatge quan es fa més petita.</span></div><div style="font-family: "Courier New",Courier,monospace;">glTexParameteri( tipus,</div><div style="font-family: "Courier New",Courier,monospace;"> GL_TEXTURE_MIN_FILTER,</div><div style="font-family: "Courier New",Courier,monospace;"> param); </div><div style="font-family: "Courier New",Courier,monospace;"> <span style="color: #38761d;">//GL_NEAREST, GL_LINEAR</span></div><div style="color: #38761d; font-family: "Courier New",Courier,monospace;"> //GL_NEAREST_MIPMAP_NEAREST x4 combinacions</div><div style="color: #38761d; font-family: "Courier New",Courier,monospace;"></div><div style="color: #38761d; font-family: "Courier New",Courier,monospace;">//Definir què fa una textura quan té una coordenada fora de [0,1]</div><div style="font-family: "Courier New",Courier,monospace;">glTexParameteri( tipus,</div><div style="font-family: "Courier New",Courier,monospace;"> GL_TEXTURE_WRAP_S, <span style="color: #38761d;">//O t</span></div><div style="font-family: "Courier New",Courier,monospace;"> GL_REPEAT); <span style="color: #38761d;">//GL_CLAMP_TO_EDGE, GL_MIRRORED_REPEAT</span></div><div style="font-family: "Courier New",Courier,monospace;"><br />
</div><div style="font-family: "Courier New",Courier,monospace;"><br />
</div><div style="font-family: "Courier New",Courier,monospace;"><br />
</div><div style="font-family: "Courier New",Courier,monospace;">glGenerateMipmap(tipus); <span style="color: #38761d;">//Genera automàticament un mipmap per la </span></div><div style="color: #38761d; font-family: "Courier New",Courier,monospace;"> //textura activa</div><div style="font-family: "Courier New",Courier,monospace;"><br />
</div><div style="color: #38761d; font-family: "Courier New",Courier,monospace;">//Finalment parlem de com agafar una textura des del shader.</div><div style="color: #38761d; font-family: "Courier New",Courier,monospace;">//Per tal de fer-ho, necessitem una "uniform" especial, anomenada</div><div style="color: #38761d; font-family: "Courier New",Courier,monospace;">//"sampler" ("sampler2D" o "samplerCube")</div><div style="color: #38761d; font-family: "Courier New",Courier,monospace;"><br />
</div><div style="color: #38761d; font-family: "Courier New",Courier,monospace;">//Activem la textura en un la unitat 0:</div><div style="font-family: "Courier New",Courier,monospace;">glActiveTexture(GL_TEXTURE0); <span style="color: #38761d;">//GL_TEXTURE1, ...</span></div><div style="font-family: "Courier New",Courier,monospace;">glBindTexture(tipus, textureId);</div><div style="font-family: "Courier New",Courier,monospace;"><br />
</div><div style="color: #38761d; font-family: "Courier New",Courier,monospace;">//Fem que el sampler apunti a la unitat 0</div><div style="font-family: "Courier New",Courier,monospace;">glUniform1i(sampler_uniform, 0);</div><div style="font-family: "Courier New",Courier,monospace;"><br />
</div><span style="color: #38761d; font-family: "Courier New",Courier,monospace;">//----------------------------------------------</span><br />
També hi ha un altre tipus de textura, la textura3D, que és estandard a OpenGL i a OpenGL ES necessita de l'extenció "GL_OES_texture_3D". Funciona pràcticament igual amb una funció extra per carregar-la "glTexImage3D"[OES] amb un paràmetre adicional indicant la profunditat.<br />
<br />
Adicionalment podem crear textures de "profunditat" si l'extenció "GL_OES_depth_texture" està disponible. Això serveix essencialment amb el tema dels pBuffers (vist més endavant) i es creen amb un format "GL_DEPTH_COMPONENT" i tipus "GL_UNSIGNED_SHORT" o "GL_UNSIGNED_INT" si estàn disponibles.<br />
<br />
<br />
Continuaré en un altre moment. Falta per fer:<br />
<br />
<ul><li>pBuffers</li>
<li>Vertex Shaders</li>
<li>Fragment Shaders</li>
<li>Operacions post-shader</li>
<li>Exemples</li>
</ul><br />
[1] http://www.opengl.org/sdk/docs/man/xhtml/glUniform.xmlIsaac "Atridas" Serranohttp://www.blogger.com/profile/10992118315015501330noreply@blogger.com0tag:blogger.com,1999:blog-6619682241934117489.post-35164713194961193122010-11-30T15:19:00.001+01:002010-11-30T19:12:27.373+01:00Manifest per una xarxa neutral<b>Els ciutadans i les empreses usuàries d'Internet adherides a aquest text manifestem:</b><br />
<ol><li>Que internet és una Xarxa neutral per disseny, des de la seva creació a la seva actual implementació, en la que la informació flueix de forma lliure, sense discriminació segons origen, destí, protocol o contingut.</li>
<li> Que les empreses, emprenadors i usuaris d'Internet han pogut crear serveis i productes en aquesta Xarxa Neutral sense necessitat d'autoritzacions ni acords previs, donant pas a una barrera d'entrada pràcticament innexistent que ha permès una explosió creativa, d'innovació i de serveis que defineis l'estat de la xarxa actual.</li>
<li>Que tots els usuaris, emprenadors i empreses d'Internet han pogut definir i oferir els seus seveis en condicions d'igualtat duent el concepte de lliure competència fins extrems mai vistos abans.</li>
<li>Que Internet es el vehicle de lliure expresió, lliure informació i desenvolupament social més important amb el que comptem ciutadans i empreses. La seva natura no pot ser posada en perill sota cap concepte.</li>
<li>Que per possibilitar aquesta Xarxa Neutral les operadores han de transportar els paquets de dades de forma neutral sense actuar com a "aduaners" del tràfic i sense afavorir o perjudicar a uns continguts en front d'altres.</li>
<li>Que la gestió del tràfic en situacions puntuals i exceptionals de saturació de les xarxes ha de transcórrer de forma transparent, d'acord amb criteris homogénis i d'interés públic i no discriminatoris ni comercials.</li>
<li>Que aquesta restricció excepcional del tràfic per part de les operadores no pot convertir-se en una alternativa sostinguda a la inversió en xarxes.</li>
<li>Que aquesta Xarxa Neutral es veu amenaçada per operadores interessades a arribar a acords comercials per els que es privilegii o degradi el contingut segons la seva relació comercial amb dita operadora.</li>
<li>Que algunes operadores del mercat volen "redefinir" la Xarxa Neutral per a emprar-la d'acord amb els seus interessos, i aquesta pretenció cal que sigui evitada; la definició de les regles fonamentals d'Internet han de basar-se en l'interès d'aquells que l'utilitzen, no d'aquells que el proveeixen.</li>
<li>Que la resposta en front d'aquesta amenaça per la xarxa no pot ser la inacció: no fer res equival a permetre que interesos privats puguin <i>de facto</i> emprar pràctiquesque afectin les llibertats funamentals dels ciutadans i la capacitat de les empreses per competir en igualtat de condicions.</li>
<li>Que és necessari i urgent instar al Gobern a protegir de manera clara i inequívoca la Xarxa Neutral, amb la fí de protegir el valor d'Internet de cara al desenvolupament d'una economia més productiva, moderna, eficient i lliure d'injerències i intromisions indegudes. Per això és necessari que qualsevol moció que s'aprovi vinculi de manera indissoluble la definició de Xarxa Neutral en el contingut de la futura llei que la promogui, i no condicioni la seva aplicació a cuestions que poc tinguin a veure amb aquesta.</li>
</ol><br />
<br />
<br />
<br />
<br />
<br />
A continuació us adjunto l'original en Castellà:<br />
<br />
<br />
<div style="border-width: 0px; color: #4d4d4d; font-size: 13px; margin: 0px 0px 9px; outline-width: 0px; padding: 0px;"><b style="border-width: 0px; color: #2e2e2e; font-size: 13px; margin: 0px; outline-width: 0px; padding: 0px;">Los ciudadanos y las empresas usuarias de Internet adheridas a este texto manifestamos:</b></div><div style="border-width: 0px; color: #4d4d4d; font-size: 13px; margin: 0px 0px 9px; outline-width: 0px; padding: 0px;">1.- Que Internet es una Red Neutral por diseño, desde su creación hasta su actual implementación, en la que la información fluye de manera libre, sin discriminación alguna en función de origen, destino, protocolo o contenido.</div><div style="border-width: 0px; color: #4d4d4d; font-size: 13px; margin: 0px 0px 9px; outline-width: 0px; padding: 0px;">2.- Que las empresas, emprendedores y usuarios de Internet han podido crear servicios y productos en esa Red Neutral sin necesidad de autorizaciones ni acuerdos previos, dando lugar a una barrera de entrada prácticamente inexistente que ha permitido la explosión creativa, de innovación y de servicios que define el estado de la red actual.</div><div style="border-width: 0px; color: #4d4d4d; font-size: 13px; margin: 0px 0px 9px; outline-width: 0px; padding: 0px;">3.- Que todos los usuarios, emprendedores y empresas de Internet han podido definir y ofrecer sus servicios en condiciones de igualdad llevando el concepto de la libre competencia hasta extremos nunca antes conocidos.</div><div style="border-width: 0px; color: #4d4d4d; font-size: 13px; margin: 0px 0px 9px; outline-width: 0px; padding: 0px;">4.- Que Internet es el vehículo de libre expresión, libre información y desarrollo social más importante con el que cuentan ciudadanos y empresas. Su naturaleza no debe ser puesta en riesgo bajo ningún concepto.</div><div style="border-width: 0px; color: #4d4d4d; font-size: 13px; margin: 0px 0px 9px; outline-width: 0px; padding: 0px;">5.- Que para posibilitar esa Red Neutral las operadoras deben transportar paquetes de datos de manera neutral sin erigirse en “aduaneros” del tráfico y sin favorecer o perjudicar a unos contenidos por encima de otros.</div><div style="border-width: 0px; color: #4d4d4d; font-size: 13px; margin: 0px 0px 9px; outline-width: 0px; padding: 0px;">6.- Que la gestión del tráfico en situaciones puntuales y excepcionales de saturación de las redes debe acometerse de forma transparente, de acuerdo a criterios homogéneos de interés público y no discriminatorios ni comerciales.</div><div style="border-width: 0px; color: #4d4d4d; font-size: 13px; margin: 0px 0px 9px; outline-width: 0px; padding: 0px;">7.- Que dicha restricción excepcional del tráfico por parte de las operadoras no puede convertirse en una alternativa sostenida a la inversión en redes.</div><div style="border-width: 0px; color: #4d4d4d; font-size: 13px; margin: 0px 0px 9px; outline-width: 0px; padding: 0px;">8.- Que dicha Red Neutral se ve amenazada por operadoras interesadas en llegar a acuerdos comerciales por los que se privilegie o degrade el contenido según su relación comercial con la operadora.</div><div style="border-width: 0px; color: #4d4d4d; font-size: 13px; margin: 0px 0px 9px; outline-width: 0px; padding: 0px;">9.- Que algunos operadores del mercado quieren “redefinir” la Red Neutral para manejarla de acuerdo con sus intereses, y esa pretensión debe ser evitada; la definición de las reglas fundamentales del funcionamiento de Internet debe basarse en el interés de quienes la usan, no de quienes la proveen.</div><div style="border-width: 0px; color: #4d4d4d; font-size: 13px; margin: 0px 0px 9px; outline-width: 0px; padding: 0px;">10.- Que la respuesta ante esta amenaza para la red no puede ser la inacción: no hacer nada equivale a permitir que intereses privados puedan de facto llevar a cabo prácticas que afectan a las libertades fundamentales de los ciudadanos y la capacidad de las empresas para competir en igualdad de condiciones.</div><div style="border-width: 0px; color: #4d4d4d; font-size: 13px; margin: 0px 0px 9px; outline-width: 0px; padding: 0px;">11.- Que es preciso y urgente instar al Gobierno a proteger de manera clara e inequívoca la Red Neutral, con el fin de proteger el valor de Internet de cara al desarrollo de una economía más productiva, moderna, eficiente y libre de injerencias e intromisiones indebidas. Para ello es preciso que cualquier moción que se apruebe vincule de manera indisoluble la definición de Red Neutral en el contenido de la futura ley que se promueve, y no condicione su aplicación a cuestiones que poco tienen que ver con ésta.</div><div style="border-width: 0px; color: #4d4d4d; font-size: 13px; margin: 0px 0px 9px; outline-width: 0px; padding: 0px;">La Red Neutral es un concepto claro y definido en el ámbito académico, donde no suscita debate:<b style="border-width: 0px; color: #2e2e2e; font-size: 13px; margin: 0px; outline-width: 0px; padding: 0px;">los ciudadanos y las empresas tienen derecho a que el tráfico de datos recibido o generado no sea manipulado, tergiversado, impedido, desviado, priorizado o retrasado en función del tipo de contenido, del protocolo o aplicación utilizado, del origen o destino de la comunicación ni de cualquier otra consideración ajena a la de su propia voluntad. Ese tráfico se tratará como una comunicación privada y exclusivamente bajo mandato judicial podrá ser espiado, trazado, archivado o analizado en su contenido, como correspondencia privada que es en realidad.</b></div><div style="border-width: 0px; color: #4d4d4d; font-size: 13px; margin: 0px 0px 9px; outline-width: 0px; padding: 0px;">Europa, y España en particular, se encuentran en medio de una crisis económica tan importante que obligará al cambio radical de su modelo productivo, y a un mejor aprovechamiento de la creatividad de sus ciudadanos. La Red Neutral es crucial a la hora de preservar un ecosistema que favorezca la competencia e innovación para la creación de los innumerables productos y servicios que quedan por inventar y descubrir. La capacidad de trabajar en red, de manera colaborativa, y en mercados conectados, afectará a todos los sectores y todas las empresas de nuestro país, lo que convierte a Internet en un factor clave actual y futuro en nuestro desarrollo económico y social, determinando en gran medida el nivel de competitividad del país. De ahí nuestra profunda preocupación por la preservación de la Red Neutral. Por eso instamos con urgencia al Gobierno español a ser proactivo en el contexto europeo y a legislar de manera clara e inequívoca en ese sentido.</div>Isaac "Atridas" Serranohttp://www.blogger.com/profile/10992118315015501330noreply@blogger.com0tag:blogger.com,1999:blog-6619682241934117489.post-66725411399314337992010-11-05T14:59:00.001+01:002010-11-05T15:24:29.706+01:00NoticietesM'ha arribat la notícia que fa prop de més i mig que no escric res a aquest blog.<br />
<br />
Raons? Baja, ningú s'ha queixat, he començat la uni, he començat a fer coses diverses que duen força feina...<br />
<br />
Anirem a pams: He entrat al master de videojocs de la UAB. Puc dir-ne què en penso? De moment, quan només he fet 4 setmanes (3 de "teoria" i 3 dies de pràctica, aquesta ha estat una setmana curta) m'ha agradat força el que he vist, i el que intueixo per al futur: apendre a treballar en grup. Ara en sério. Aqui serem, si no falla res, uns 5 programadors i un parell d'artistes (que ja veurem com va lo dels artistes, ja que hi ha "problemilles"...), i també hi ha moltíssima feina, així que ningú se salvarà de pringar.<br />
<br />
Per posar un exemple, hem tardat 3 dies en configurar el VS, i encara no estem del tot d'acord. Amb prou feines hem acabat la feina que se suposava que hauriem de fer aquesta setmana!!!<br />
<br />
L'objectiu final del màster serà crear una demo tecnològica entre "tots". Hem plantejat un parell de propostes:<br />
<ul><li>Joc shooter en un futurista "retro" (amb elements desfassats, fora de temps, per mostrar declivi)</li>
<li>Un plataformes estúpid de ninjas vs pirates amb ambientacions históriques caricaturesques. Concretament aqui seràs un ninja a l'anic egipte on estàn construint un esfinx del capità pirata.</li>
</ul>Farem la primera opció, no us enganyeu, però ens ho hem passat d'allò més bé escrivint tonteries per la segona xD<br />
<br />
<br />
Altres coses a fer? No podia faltar la nota política. Després del desencant dels partits independentistes (reagrupament, SCI...) vaig passarma a pirata.cat, com els que van llegir l'última entrada van deduir. Avui estava pensant en coses de copyright i volia escriure una entrada al respecte, però he decidit fer una petita re-presentació de mi mateix després de tant de temps sense escriure.<br />
<br />
Què em toca fer a pirata.cat? Practicament res, a vegades els ajudo una mica, l'altre dia vaig estar unes hores muntant les llistes electorals amb ells. Sembla mentida, però ens presentem a les 4 diputacions (cosa no fàcil) i amb més dones de l'estrictament necessàri (40% mínim de cada sexe, i cada grup de 5 cal que sigui 2/3 o 3/2, nosaltres crec que arrivem al 45% o 46% de dones a barcelona, on s'han de presentar 80 persones!). Recordem que pirata.es no es va poder presentar ja que no complia el requisit de la paritat (pobrets...).<br />
<br />
Recompensa? Sóc 18è a la llista de barna. Com de dalt és això? A ERC haguès entrat al 2006 (en van treure 21), però no al PP ni a ICV (C's no hauria d'existir, com tothom sap). Fent regles de 3 extranyes, necessitaria que pirata.cat atregués 266.000 vots a la província de Barcelona, una fita difícil.<br />
<br />
Arribarà pirata.cat al 3% de vots necessàri per entrar al parlament? Tot és una fita, i si arriba poques coses "pràctiques" podrem fer, PERÒ, tindrem veu, i tenir veu, encara que el vot que tinguis sigui minso, és important, com ja s'ha vist al parlament europeu (van firmar en contra d'ACTA a iniciativa del partit pirata suec, que hi té 2 representants. <a href="http://es.wikipedia.org/wiki/Anti-Counterfeiting_Trade_Agreement">Què és ACTA? Una llarga história, certament...[1]</a>) i moltes coses que pirata.cat defensa són fàcilment defensables des de altres partits, l'objectiu no és tant governar (des del meu punt de vista) com posar certes coses a l'agenda política, diguise'n democràcia directa, una racionalització del copyright (més en un post que farè més tard), una descriminalització del ciutadà (Canon, etc...), neutralitat de la xarxa, bla bla bla...<br />
<br />
Una altra cosa semi-important que vui dir: hi van haver bufetades per no anar de cap de llista, pràcticament. Dels 3 candidats que hi van haver destaco el que finalment anirà 6è a les llistes, un profesor de català nascut a valència que fa temps que ajuda a la comunitat del software lliure català (i valencià i balear, per extenció). El perfil del candidat final ja el sabreu si mireu al blog de <a href="http://pirata.cat/">pirata.cat</a>, i de l'últim teníem un poeta, així que no tothom és un informàtic (o biotecnòleg, estan molt amoïnats per el tema de les patents d'ADN. Sona xungo? Ho és!!!).<br />
<br />
[1] http://es.wikipedia.org/wiki/Anti-Counterfeiting_Trade_Agreement<br />
<br />
P.S.: M'he equivocat al posar els resultats del 2006, ERC va treure 11 diputats, així que ni a ERC entraria xDDDDD. Per treure'n 18 es necessiten uns 450.000 (però depèn tot, obviament, del % de participació)Isaac "Atridas" Serranohttp://www.blogger.com/profile/10992118315015501330noreply@blogger.com0tag:blogger.com,1999:blog-6619682241934117489.post-60096623859894102172010-09-14T21:04:00.001+02:002010-09-14T22:15:21.323+02:00Pirata.cat<div class="ace-line" id="magicdomid111"><span class="author-g-gic2rlz122z9fltxtz122zfq">Aquestes eleccions, 29-N, seràn unes de les més disputades últimament, sobretot, pel que fa a partits nous (després veurem els anàlisis a posteriori, quan res hagi canviat).</span></div><div class="ace-line" id="magicdomid9"><br />
</div><div class="ace-line" id="magicdomid50"><span class="author-g-gic2rlz122z9fltxtz122zfq">Tenim, així interessantment, Reagrupament, Solidaritat Catalana per la Independència i, menys nou, Ciutadans. Parlo de ciutadans, que ja té una legislatura de vida, per posar el mateix exemple, però a l'altra banda, o sigui, un partit nou "anti-catalanista", quan els primers són els partits nous "catalanistes".</span></div><div class="ace-line" id="magicdomid11"><br />
</div><div class="ace-line" id="magicdomid54"><span class="author-g-gic2rlz122z9fltxtz122zfq">Per què apareixen aquests partits? Una raó important, al meu parer és la "decepció" als partits tradicionals. Decepció per que no aporten solucions prou "granulars", en altres paraules, quan toca votar, toca votar un paquet monolític de projecte, sense espai a modificacions. Ens estàn dient que només hi ha 6 (CiU, PSC, ERC, ICV, PP, C's) maneres diferents d'encarar els próxims 4 anys? I els punts mitjos, i les co</span><span class="author-g-gc021xg3ey062gwk">mb</span><span class="author-g-gic2rlz122z9fltxtz122zfq">inacions? Potser vui un model d'autogovern com el que proposa ERC, però unes polítiques socials de ICV.</span></div><div class="ace-line" id="magicdomid13"><br />
</div><div class="ace-line" id="magicdomid55"><span class="author-g-gic2rlz122z9fltxtz122zfq">A tot això han aparegut els nous partits. C's s'explica per l'alternativa centralitzadora d'esquerres a ERC/PSC. I tant reagrupament com solidaritat es centren en un eix poc practicat: l'autodeterminació definitiva i desacomplexada.</span></div><div class="ace-line" id="magicdomid15"><br />
</div><div class="ace-line" id="magicdomid16"><span class="author-g-gic2rlz122z9fltxtz122zfq">I ara apareix el Partit Pirata de Catalunya (nom provisional [1]), donant resposta al mateix problema.</span></div><div class="ace-line" id="magicdomid17"><br />
</div><div class="ace-line" id="magicdomid125"><span class="author-g-gic2rlz122z9fltxtz122zfq">Els diferents partits pirates que han anat apareixent a europa s'han creat amb la idea de donar molta més participació i marge de decisi</span><span class="author-g-gc021xg3ey062gwk">ó</span><span class="author-g-gic2rlz122z9fltxtz122zfq"> al ciutadà dia a dia, sense limitar-se a decisions monolítiques i puntuals cada 4 anys.</span></div><div class="ace-line" id="magicdomid19"><br />
</div><div class="ace-line" id="magicdomid127"><span class="author-g-gic2rlz122z9fltxtz122zfq">Per això una de les bases de pirata.cat és tenir un programa (ideari) clar i senzill, del que parlaré després, i deixar la resta de d</span><span class="author-g-gc021xg3ey062gwk">e</span><span class="author-g-gic2rlz122z9fltxtz122zfq">cisions en mans dels afiliats.</span></div><div class="ace-line" id="magicdomid21"><br />
</div><div class="ace-line" id="magicdomid64"><span class="author-g-gic2rlz122z9fltxtz122zfq">Això faria que un govern de pirata.cat aportés sobretot propostes basades </span><span class="author-g-gc021xg3ey062gwk">en</span><span class="author-g-gic2rlz122z9fltxtz122zfq"> l'ideari, algunes proposades per afiliats, i sobretot acceptés moltes propostes d'altres partits (després de tot, es tracta de governar entre tots, aqu</span><span class="author-g-gc021xg3ey062gwk">í</span><span class="author-g-gic2rlz122z9fltxtz122zfq"> no hauríem pas de ser enemics sinó la representació del poble català).</span></div><div class="ace-line" id="magicdomid23"><br />
</div><div class="ace-line" id="magicdomid24"><span class="author-g-gic2rlz122z9fltxtz122zfq">Així doncs, de què va l'ideari pirata? Doncs hi tenim 5 punts:</span></div><div class="ace-line" id="magicdomid70"><ul class="list-bullet1"><li><span class="author-g-gic2rlz122z9fltxtz122zfq">Mantenir i preservar drets i llibertats que es consideren bàsics i que últimament, amb l'excusa de la lluita contra el terrorisme i la pederàstia s'estàn deixant de banda: la llibertat d'expresió, la presump</span><span class="author-g-gc021xg3ey062gwk">c</span><span class="author-g-gic2rlz122z9fltxtz122zfq">ió d'in</span><span class="author-g-gc021xg3ey062gwk">n</span><span class="author-g-gic2rlz122z9fltxtz122zfq">ocència i la privacitat són alguns exemples que s'estan deixant enrere amb aquestes excuses.</span></li>
</ul></div><div class="ace-line" id="magicdomid75"><ul class="list-bullet1"><li><span class="author-g-gic2rlz122z9fltxtz122zfq">Fomentar i protegir l'ús d'internet. Que sigui considerat un servei bàsic com l'aigua i l'electricitat, i que se'n protegeixi la neutralitat, per impedir pràctiques on serveis i opinions puguin ser silenciades pels operadors, o que existeixi</span><span class="author-g-gc021xg3ey062gwk">n</span><span class="author-g-gic2rlz122z9fltxtz122zfq"> diferents internets, depenent de la capacitat adquisitiva de l'usuari (neutralitat de la xarxa).</span></li>
</ul></div><div class="ace-line" id="magicdomid120"><ul class="list-bullet1"><li><span class="author-g-gic2rlz122z9fltxtz122zfq">Remodelar el sistema de drets d'autors per </span><span class="author-g-gc021xg3ey062gwk">dur</span><span class="author-g-gic2rlz122z9fltxtz122zfq"> el protagonisme als usuaris i als creadors, en comptes dels distribu</span><span class="author-g-gc021xg3ey062gwk">ï</span><span class="author-g-gic2rlz122z9fltxtz122zfq">dors, per tal d'aconseguir que la cultura sigui un negoci renovat i adaptat al nou panorama que internet ha creat. I també eliminar polítiques nascudes de la incapacitat d'adaptar-se</span><span class="author-g-gc021xg3ey062gwk">, </span><span class="author-g-gic2rlz122z9fltxtz122zfq">com ha estat el C</span><span class="author-g-gc021xg3ey062gwk">à</span><span class="author-g-gic2rlz122z9fltxtz122zfq">non Digital</span><span class="author-g-gc021xg3ey062gwk">:</span><span class="author-g-gic2rlz122z9fltxtz122zfq"> (</span><span class="author-g-gc021xg3ey062gwk">q</span><span class="author-g-gic2rlz122z9fltxtz122zfq">uantes coses a dir en aquest aspecte).</span></li>
</ul></div><div class="ace-line" id="magicdomid118"><ul class="list-bullet1"><li><span class="author-g-gic2rlz122z9fltxtz122zfq">Renovar el sistema de patents, impedir que siguin renovables i que tinguin un temps d'expiració raonable per a recuperar la inversió però també per afa</span><span class="author-g-gc021xg3ey062gwk">v</span><span class="author-g-gic2rlz122z9fltxtz122zfq">orir </span><span class="author-g-gc021xg3ey062gwk">la </span><span class="author-g-gic2rlz122z9fltxtz122zfq">evolució tecnològica. Oposició frontal a les patents del software i sobre els </span><span class="author-g-gc021xg3ey062gwk">é</span><span class="author-g-gic2rlz122z9fltxtz122zfq">ssers vius.</span></li>
</ul></div><div class="ace-line" id="magicdomid29"><ul class="list-bullet1"><li><span class="author-g-gic2rlz122z9fltxtz122zfq">Fomentar la democràcia directa i la participació ciutadana.</span></li>
</ul></div><div class="ace-line" id="magicdomid30"><br />
</div><div class="ace-line" id="magicdomid31"><br />
</div><div class="ace-line" id="magicdomid110"><span class="author-g-gic2rlz122z9fltxtz122zfq">[1] El nom del </span><span class="author-g-gic2rlz122z9fltxtz122zfq i"><i>Partit Pirata de Catalunya </i></span><span class="author-g-gic2rlz122z9fltxtz122zfq">(pirata.cat) és provisional ja que existeix un </span><span class="author-g-gic2rlz122z9fltxtz122zfq i"><i>Partido Pirata</i></span><span class="author-g-gic2rlz122z9fltxtz122zfq"> (pirata.es) i la llei ara impedeix crear partits amb noms que puguin dur a confondre</span><span class="author-g-gc021xg3ey062gwk">'</span><span class="author-g-gic2rlz122z9fltxtz122zfq">s amb partits anteriors</span><span class="author-g-gc021xg3ey062gwk">,</span><span class="author-g-gic2rlz122z9fltxtz122zfq"> a no ser que es presenti davant </span><span class="author-g-gc021xg3ey062gwk">de</span><span class="author-g-gic2rlz122z9fltxtz122zfq"> notari un document on el partit antic accepti com a subeditat el nou. I en aquest cas concret, pirata.cat no vol ser cap "edició catalana" de pirata.es, sinó una "edició catalana" del Partit Pirata Internacional.</span></div>Isaac "Atridas" Serranohttp://www.blogger.com/profile/10992118315015501330noreply@blogger.com0tag:blogger.com,1999:blog-6619682241934117489.post-71857740595815143982010-09-05T12:59:00.002+02:002010-09-05T12:59:54.101+02:00Petita nota lingüísticaEs vé a afirmar el que ja sabíem:<br />
<br />
El Valencià és diferent al Català per raons polítiquen, que no acadèmiques.<br />
<br />
Per mostra, un <a href="http://www.racocatala.cat/noticia/23912/govern-valencia-elimina-mencio-catala-dels-estatuts-universitat-jaume-i">botó</a>.Isaac "Atridas" Serranohttp://www.blogger.com/profile/10992118315015501330noreply@blogger.com1tag:blogger.com,1999:blog-6619682241934117489.post-6637040742193383952010-08-20T20:08:00.000+02:002010-08-20T20:08:16.284+02:00CorreccióSemblen una mica menys indecents els de SC.<br />
<br />
Hi ha 3 tipus de persones:<br />
<ol><li>Adherits (han pagat 20€ a Solidaritat)</li>
<li>Simpatitzants (s'han inscrit a la web)</li>
<li>Amics i saludats</li>
</ol>Per votar a primàries cal ser adherit abans de les primàries.<br />
Per ser candidat cal ser simpatitzant avans del 16 d'Agost i Adherit abans del 31.<br />
<br />
Aqui teniu l'explicació per haber-ho explicat després del 16:<br />
<br />
<span lang="CA" style="font-size: 12pt; line-height: 115%;">"SCI només demana haver-se donat d'alta en una web i fer un pagament de 20 euros, i aquesta facilitat requereix prendre precaucions front a incorporacions interessades, de persones o grups espanyolistes que dediquin diners a ser elegits i rebentar SCI per dintre. Apuntar 1.000 persones només costa 20.000 euros, una propina per a organitzacions espanyolistes o contràries a la independència que, si haguessin sabut que era tan fàcil, i si encara poguessin fer-ho, podrien amb pocs diners fer elegir candidats a la seva conveniència. Siguem demòcrates i transparents, però no ingenus."</span><br />
<br />
<span lang="CA" style="font-size: 12pt; line-height: 115%;">Tornen a guanyar punts, però vigilem-los! </span>Isaac "Atridas" Serranohttp://www.blogger.com/profile/10992118315015501330noreply@blogger.com0tag:blogger.com,1999:blog-6619682241934117489.post-21486749207637461352010-08-18T13:54:00.001+02:002010-08-18T14:03:28.593+02:00Vergonyós (enèsima part)Bé, crec que ja entenc a tots als que Solidaritat Catalana no els hi fa molta gràcia.<br />
<br />
Concretament, a data de <span class="gI">17 d’agost de 2010, 21:03, vaig rebre un mail on explicaven com presentar-se a les primàries de solidaritat.</span><br />
<span class="gI"><br />
</span><br />
<span class="gI">El resum és: has d'estar inscrit i haver pagat quota (20€) abans del 16 d'agost.</span><br />
<span class="gI"><br />
</span><br />
<span class="gI">Això fot un tuf enorme.</span><br />
<br />
<span class="gI">P.S.: Al Rin del Nord / Westfàlia (allà on hi ha Düsseldorf, Colònia i Dortmund) hi ha <a href="http://avui.elpunt.cat/noticia/article/3-politica/17-politica/207688-sestan-gestant-canvis-a-espanya.html">un polític que ha calat lo que passa a Catalunya i ha proposat la única solució que pot acavar bé per espanya</a>. Quina llàstima que no li faràn pas cap cas. </span>Isaac "Atridas" Serranohttp://www.blogger.com/profile/10992118315015501330noreply@blogger.com0tag:blogger.com,1999:blog-6619682241934117489.post-78221364747181248392010-08-05T22:18:00.000+02:002010-08-05T22:18:21.113+02:00Ha arribat l'hora<div class="separator" style="clear: both; text-align: center;"></div><div class="separator" style="clear: both; text-align: center;"><a href="http://4.bp.blogspot.com/_yOBLFfaoLjE/TFKcSsm1dfI/AAAAAAAAA9E/-7skRV8m8rY/s1600/sc2-01.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://4.bp.blogspot.com/_yOBLFfaoLjE/TFKcSsm1dfI/AAAAAAAAA9E/-7skRV8m8rY/s320/sc2-01.png" /></a></div><br />
Tret de <a href="http://nearbythoughts.blogspot.com/2010/07/temporarily-closed-wings-of-liberty.html">nearby thoughts</a>Isaac "Atridas" Serranohttp://www.blogger.com/profile/10992118315015501330noreply@blogger.com0tag:blogger.com,1999:blog-6619682241934117489.post-63778111564889366122010-07-30T15:47:00.001+02:002010-07-30T15:50:37.192+02:00LlenguatgeEstan passant moltes coses, no creieu?<br />
<br />
La sentència de l'estatut és, no ho neguem, la més important. Avui diuen que el TC s'ha ventilat una altra llei catalana. I parlem dels toros: el 1991 un diputat del PP a Canàries va proposar que es prohibissin els toros en aquella comunitat - on feia ja 6 anys que no es feia cap <i>corrida </i>-, i així es va fer, però això no ha servit per a callar a la direcció del PP.<br />
<br />
Què vol fer ara el PP? Demostrar "qui mana aquí". O sigui, sincerament, la millor idea que han tingut mai: declarar els toros patrimoni nacional i treure així les competències respecte aquesta matèria a les comunitats autònomes. En altres paraules, prohibir la prohibició.<br />
<br />
I ara em pregunto, en quin món viuen aquesta gent? Tenen una mínima idea del ressentiment que ha creat la sentència del TC al treure-li l'última paraula a Catalunya sobre les seves pròpies lleis? S'han oblidat que la prohibició dels toros ha sortit d'una <i>iniciativa popular</i>? Si realment són una mica conscient del que està passant, i tot i així continuen endavant, només en trec una possible conclusió: volen trencar Espanya, i quedar-se amb les restes.<br />
<br />
Aquí passo a la part 2. Els eixos polítics.<br />
<br />
Tota la vida ens han vingut explicant que els partits polítics es troben distribuïts al llarg d'un eix: l'eix esquerra-dreta. El que vol dir aquest eix poca gent ho té clar, ja que aquí (i l'altre exemple bipartidista important que tenim, EEUU) hi ha 2 partits i un es proclama d'esquerres i l'altre de dretes, i aleshores agafem la definició d'esquerres i dretes a partir del que fan.<br />
<br />
Però esquerres i dretes no vol dir només això.<br />
<br />
Esquerres normalment vol dir 2 coses: econòmicament, una intervenció de l'estat relativament alta, donant prestacions als ciutadans a través del repartiment de la riquesa; i socialment una àmplia acceptació i normalització de les llibertats individuals (Aborts, Homosexualitat, etc...).<br />
<br />
En la part de la dreta ens trobem amb la teoria de "deixar que l'economia voli al seu aire", ja que sense tanta pressió està demostrat que l'economia millora més de pressa -clar que, segons els detractor, jo inclòs, té el perillós efecte secundari de córrer massa i fotre's una castanya del 15 (ejem crisi actual ejem), a més tendeix a distanciar els rics dels pobres, i això, encara que la mitjana surti "millor" és com l'acudit de l'estadista que té una mà al forn i l'altre al congelador i diu que està "bé" - i així l'economia va millor en general. En l'àmbit "personal" aquests partits tendeixen a agafar-se a les tradicions i tal... no sé com explicar-ho d'una manera que sembli una opció decent.<br />
<br />
Personalment crec que una cosa no hauria d'anar lligada a l'altre. Vull dir, i si jo "crec" en el liberalisme econòmic, però també en les llibertats individuals, què?<br />
<br />
Però ara passem a la part peluda, i és que a Espanya hi ha un altre eix. L'eix "com collons ens organitzem en aquest estat". A Catalunya això es resumeix en Independència-Federació-Autonomisme-Província indistingible. A Espanya, això es resumeix en... negociar amb Catalunya i/o Euskadi el que demanin i donar-ne una mica només no fos cas que s'ho creguin (opció A), o no (opció B).<br />
<br />
I aquí és on entra el títol del post. Ha estat una notícia de <a href="http://www.elpais.com/articulo/espana/independentismo/alcanza/Cataluna/maximo/historico/elpepuesp/20100730elpepunac_7/Tes">El País </a>el que m'ha fet pensar-hi. És una qüestió de llenguatge, només llenguatge. Al principi no te n'adones, però quan ho fas, hi veus la importància.<br />
<br />
Es parla de Catalunya.<br />
<br />
I es parla d'Espanya.<br />
<br />
En altres paraules, el TC va negar <i>de jure </i>les relacions bilaterals, però resulta que les tenim <i>de facto</i>, o sigui, que encara que en cap llei pugui dir que Catalunya i Espanya són ens diferents (de fet, un és inclòs a l'altre) la consciència col·lectiva ja les tracta per separat i és totalment normal fer-ho i l'estrany seria que algú no ho fes. Aquest fet és molt important, i per això li dedico el post.<br />
<br />
Ara una miqueta allunyat del paràgraf anterior, però una cosa que fa dies que volia dir:<br />
<br />
El PP se n'ha adonat que espanya és clarament d'esquerres, econòmicament parlant. I per això posa la lluita en una altra banda. Per què critica tant les decisions econòmiques del govern i no en proposa de seves? Per que saben que a Espanya no agraden (en general). Així que posa la guerra en els altres 2 eixos, els que sap que en pot treure alguna cosa: l'eix de "conservador" en el sentit de tradicions, etc... i sobretot l'eix "sobiranista" (i en aquest eix, és el PSOE el que no s'atreveix a lluitar-hi, ja que sap que en surt perdent... a Espanya, però el no posar-s'hi li sortirà car a Catalunya, molt car si tot continua com apunten les enquestes).<br />
<br />
Lo que em cabreja ara mateix és que a Catalunya els partits d'esquerra segueixen la mateixa tàctica. ERC, i sobretot i molt especialment, ICV, donen molta importància a l'eix econòmic i social, fent cas omís que el punt comú ara mateix a Catalunya és l'altre eix. Sincerament, l'excusa de ICV de no apuntar-se a Solidaritat és com a mínim trista i molt decepcionant: "no ens aliarem mai amb la dreta". Per a ells és això: la dreta és l'enemic, i cal combatre'l a qualsevol cost. Per altra banda, ERC diu que no vol perdre "el seu projecte social" (més de lo mateix). Com a excusa a tot plegat, diu s'hi apunta si CIU s'hi apunta també, però la veritat és que saben que CIU no ho farà. I no em queixaré ara de CIU, crec que CIU té bones raons per no apuntar-s'hi, encara que jo pensi d'una altra manera.<br />
<br />
Les raons són bàsicament les següents: Convergència duu massa temps amb Unió, i Unió es proclama obertament autonomista, decisió que ja no puc compartir, però com a demòcrata convençut, respecto. El que si que penso és que a Convergència li pesa una mica unió, però si amb una mica de sort en Mas compleix el que ha promès, estaré decentment no decepcionat amb ell.<br />
<br />
I és que, demanar el concert econòmic ara mateix pot ser molt molt i molt divertit.<br />
<br />
Vota Laporta. <br />
<br />
Ja que potser no escriuré en un temps, ho foto tot junt.<br />
<br />
Si en Laporta, en Carretero, i els de SI són una mica intel·ligents faran el que potser estan fent.<br />
<br />
Reagrupament va començar fa un any, amb força. Ara critiquen als de Solidaritat Catalana dient que porten massa poc temps i no es podran presentar "en condicions". Ara jo us dic: ens al contrari. Quan temps feia que no sentíem res de Reagrupament? Força. Ara, SC ha entrat amb força, però d'aquí a un més ja ningú se n'enrecordarà. SI s'ha presentat i ha estat una mica fred tot plegat, però agrupa un bon nombre d'assossiacions. Si tots plegats són una mica intel·ligents, esperaran fins a mitjans de setembre per començar a fer soroll de veritat - unir-se els uns amb els altres, vaja - així que la consciència col·lectiva no els oblidi tan ràpidament i poder arribar a finals d'octubre (eleccions) essent el centre d'atenció.<br />
<br />
I és que queda massa, a opinió meva, per les eleccions, que si haguessin estat fa una setmana, hagués estat trumfant, amb tothom cabrejat, etc... però ara sembla que els ànims es poden refredar i buf...<br />
<br />
En fi, demanem-li al rajoy que, si pot, proposi aquesta prohibició de prohibició taurina el setembre o a l'octubre, ni que sigui per encendre els ànims una mica.<br />
<br />
Salut, i força al canut! (que per cert, aquesta expressió he descobert que va de que antigament els catalans no tenien butxaques, ja que essencialment no s'havien inventat, així que duien un canut de pell a la faixa amb tota la pasta. Així que la pròxima vegada que feu servir l'expressió, ja sabeu que desitgeu salut econòmica, també...)<br />
<br />
Long post is loooooooooooooooooooooooooooooooooongIsaac "Atridas" Serranohttp://www.blogger.com/profile/10992118315015501330noreply@blogger.com1tag:blogger.com,1999:blog-6619682241934117489.post-72402072587747601782010-07-24T23:22:00.001+02:002010-07-24T23:22:21.615+02:00He sobreviscut a la Love Parade!Ha estat una odissa. Hem tardat la ostia en arribar a Duisburg (tren amb retard que s'esperava 10 o fins i tot 30 minuts a les estacions). I un cop hem arribat allà ens ha costat d'entendre cap on haviem d'anar, estava tot a petar.<br />
<br />
I finalment hem trobat on era la loveparade aquesta, rere un cordó de policies amb automàtiques que deien "hi ha massa gent, ja no hi pot entrar ningú més". Gràcies.<br />
<br />
Després m'he enterat que <a href="http://www.elperiodico.cat/ca/noticias/societat/20100724/com-minim-morts-duisburg-celebracio-del-festival-love-parade/403150.shtml">han mort 15 persones en una allau humana</a>. Vaia tela. No se exactament què diu a la noticia, però jo em pensava que era a l'estació de tren, ja que l'han tancada unes hores (i ens hi hem vist atrapats fora) i tornar ha estat una altra odissea. Que eren les 6 quan voliem entrar a l'estació, les 7:30 quan hi hem entrat i les 10:20 quan hem arribat a Dortmund...<br />
<br />
Estic bé, jo, per això ;-DIsaac "Atridas" Serranohttp://www.blogger.com/profile/10992118315015501330noreply@blogger.com0tag:blogger.com,1999:blog-6619682241934117489.post-31403656807015671392010-07-21T18:12:00.002+02:002010-07-21T18:33:31.934+02:00Números II - Solidaritat Catalana i ERCA veure, ERC, una mica de decència.<br />
<br />
No parlaré de que ERC recolza al president que ha anat a Madrid amb la força de més d'un milió de Catalans a l'esquena i ha tornat amb res.<br />
<br />
Parlaré d'això del partit Laportista. A veure, el Laporta aquest ha fet força el gilipolles al Barça, però no se li pot negar que ha tingut una bona idea: fer un partit "únic" que agrupi el "catalanisme", amb l'objectiu de guanyar majoría al parlament i declarar la independència i fer tot seguit el referèndum.<br />
<br />
Perquè "del revés"? Bé, no es pot fer el referèndum amb l'actual marc legal, així que cal canviar el marc legal, d'alguna manera (resumint).<br />
<br />
Prou de publicitat. Per què ERC s'hauria d'unir a la coalició? Bé, primer perquè l'independentisme ja té més vots dels que ERC va guanyar les últimes eleccions (i els sondejos fan caure ERC per la següent), segon, perquè l'actual excusa d'ERC és "primer CIU". No ens enganyem, aquesta és una excusa dolenta de les de veres, sobretot per què la "U" de CIU no s'unirà (no són molt sobiranistes), però el que ERC ha de demostrar és iniciativa d'una **** vegada.<br />
<br />
Ara els números. Recordeu tot allò de les consultes populars? Mireu amb atenció:<br />
<ul><li>Persones amb dret a vot (2006): 5.212.444</li>
<li>Participació: 2.959.027 </li>
<li>Votants d'Esquerra: 416.355</li>
<li>CIU: 935.756</li>
<li>PSC: 796.173</li>
<li>Persones que han pogut votar a les consultes: 2.502.450</li>
<li>Si a la independéncia: 478.353</li>
<li>Regla de 3 del si sobre els votants totals: 996.378 (la majoria absoluta rondaria els 1.500.000 l'any 2006)</li>
</ul>O sigui... primer, el referéndum JA TÉ MÉS votants que esquerra (en absolut), però havent refrendat menys de la meitat de gent. I si la tendéncia continua igual, tindria més que CIU.<br />
<br />
En fi, el que ara necessita "Solidaritat Catalana" és presentar-se com una opció seriosa. I això passa per ERC. En altres paraules, ERC té l'oportunitat de donar un impuls potser definitiu a la independéncia, hi estarà a l'alçada?Isaac "Atridas" Serranohttp://www.blogger.com/profile/10992118315015501330noreply@blogger.com0tag:blogger.com,1999:blog-6619682241934117489.post-29334935244729044922010-07-20T00:37:00.000+02:002010-07-20T00:37:34.581+02:00Salut!Avui he après l'orígen de l'expresió "Salut, i força al canut" (i de la seva continuació "i que l'any que bé, sigui més gros i pelut!").<br />
<br />
Bé, em deixaré de segons significats que tant han calat en l'humor de la terra. La història comença quan estava buscant l'expresió "roc a la faixa" (en el context de "aquest va amb un roc a la faixa"), que he ensopegat amb el "Salut...".<br />
<br />
Doncs això, resulta que antigament els catalans no teníem això de butxaques (que és un invent relativament modern) i tot es duia a la faixa, entre totes les coses que es duien, es duia un "canut" cilíndric de pell on es duien els calers. Per tant "força al canut" bé a voler dir com... molta pasta a la butxaca. Per altra banda, la coletilla de "i que l'any que bé, sigui més gros i pelut!" es refereix al canut de pell, que quan més gros doncs, més money.<br />
<br />
I el "roc a la faixa" parla d'algú que se surt fàcilment dels problemes, és dir "tenir un pla B". En concret, tu duien un roc a la faixa per si algú et venia a atracar doncs agafaves el roc i li estampaves a la cara. Fàcil, i pràctic.<br />
<br />
Els catalans hauríem d'anar a Madrid amb el roc aquest, no estaria malament.Isaac "Atridas" Serranohttp://www.blogger.com/profile/10992118315015501330noreply@blogger.com0