Jul
11
2008
1

GUADEC/0

dalla caffetteria dell’università, a cinquanta metri dal Bosforo

anche quest’anno, il GUADEC è stata una grande esperienza. ritrovare varia umanità con cui chiaccheri solo su IRC o su mailing list mette più o meno di buon umore — e se a questo si aggiunge passare la serata fino alle tre del mattino sdraiato su cuscini bevendo te e in compagnia di un nargilé al mango il quadro è completo.

al GUADEC, però, si va anche per parlare con persone che lavorano con e su GNOME — invariabilmente questo porta a interessanti sviluppi.

leggendo un po’ in giro, vedo che alcuni si sono scandalizzati o sorpresi del new deal nelle GTK+ e in GNOME; se però avessero seguito quello che avviene ogni giorno da un anno a questa parte si sarebbero velocemente resi conto di come tutto questo sia partito dallo scorso GUADEC — e possibilmente anche da quello prima. sigillare le GTK+ per poter cambiare gli internals senza rompere le applicazioni, ridurre il lasso di tempo da major release, non sono grandi e rivoluzionari piani: sono l’unico modo di portare avanti una piattaforma in maniera organica e continua. non vi siete svegliati una mattina trovandovi venti centimetri più alti, con una voce di due ottave più bassa e i caratteri sessuali secondari completamente sviluppati — vi ci saranno voluti anni. E se gestire la pubertà è un’impresa ardua, immaginatevi un desktop con milioni di utenti su varie piattaforme su cui non esercitate alcun controllo.

GNOME ha già provato a rompere con il passato in maniera netta, con un quantum leap invece che vari passi incrementali; è stato un diastro ferroviario, e sicuramente tutti quelli coinvolti nel progetto pensano "mai più". la somma di questi piani — GTK+ 3.0 e GNOME 3.0 — sono l’unica alternativa realistica.

se poi vogliamo andare sul non-realistico, possiamo sempre contare sull’aiuto di Babbo Natale e della Fatina dei Denti — ma ho i miei dubbi sull’implementabilità.

Jan
15
2008
--

Driving Sideways

non ti rendi conto di quanto dai per scontato in Linux se non quando devi replicare un ambiente di sviluppo sotto OS X. fortunatamente, con un po’ di <a href="http://www.macports.org/">Macports</a> e di <a href="http://live.gnome.org/Jhbuild">JHBuild</a> si riesce a mettere in piedi qualcosa di usabile.

una cosa sicuramente mi piacerebbe avere anche sotto <a href="http://en.wikipedia.org/wiki/GLX">GLX</a>, e sono i <em>tool</em> per fare <em>profiling</em> delle <a href="http://developer.apple.com/graphicsimaging/opengl/opengl_serious.html">chiamate OpenGL</a>; l’<acronym title="User Interface">UI</acronym> è banale da replicare (basta prendere una cosa tipo <a href="http://labs.o-hand.com/oprofileui/">questa</a>) ma quello che è interessante è tutta la serie di <em>hooks</em> per attaccarci uno <em>statistical profiler</em>.

Written by ebassi in: Linux, Software, clutter, gnome, hacking |
Nov
01
2007
28

Dead Duck

L’altra settimana ho aggiornato il laptop a Gutsy. In generale, il <em>feel</em> è che questa release sia una mezza tragedia: non siamo ai livelli di Edgy, ma poco ci manca. Tra le cose che hanno smesso di funzionare:

<ul>
<li>NetworkManager non sopravvive al <em>suspend</em> e sono costretto a disabilitare la rete quando sposto il computer da casa all’ufficio; questo quando va bene: alle volte devo andare di <code>killall</code>. <strong>Update@2007-11-01T15:39+0100</strong>: <a href="https://bugzilla.redhat.com/show_bug.cgi?id=352771">bug noto</a>, a quanto pare risolto in SVN.</li>
<li>Se spengo il monitor sotto X (ad esempio, se chiudo il laptop ma lo lascio acceso) due volte su tre non viene riacceso e sono costretto a far ripartire GDM.</li>
</ul>

C’è di buono che GNOME 2.20 è meraviglioso, e che Debian non riconosca (ancora) l’esistenza dei laptop, altrimenti sarei tornato di corsa al mix di testing+unstable che usavo prima.

Ovviamente, ho provato di nuovo Compiz – il compositor che alle volte fa da (pessimo) window manager. L’<em>user interface</em> è un totale disastro ferroviario, in cui puoi scegliere solo tre livelli:

<ol>
<li>Niente effetti (ovvero: Metacity)</li>
<li>Effetti per persone sane di mente</li>
<li>Hurt me plenty1 (ovvero: gente che si bulla con gli amici, gente che registra un video per bullarsi con gli amici, gente che sta male perché non ha amici ma non ne ha bisogno perché ha Compiz, gentooisti)</li>
</ol>

In più, se hai qualcosa che non è installato di default e non ha un nome umanamente inferibile2, hai anche il livello segreto:

<ol style="count-reset:4" start="4">
<li>Customizzami tutta</li>
</ol>

Che permette di selezionare cose utili come il <em>motion blur</em> ma non ha un setting per avere un window manager sensato, tra il <strong>miliardo</strong> di <em>tunables</em>, plugin che si disattivano a vicenda e chiari esempi di opzioni di tipo <em>unfuck my application</em>.

Il problema è che perfino al livello per persone normali dopo dieci minuti di utilizzo comincio a sentire il mal di mare e un mal di testa impressionante. A questo va aggiunto il fatto che il trasferimento di opzioni da Metacity a Compiz è orrido e mi sono trovato dall’avere dodici workspace all’avere dodici viewport con dodici workspace l’uno – l’equivalente di 144 aree di lavoro la cui navigazione è banalmente impossible.

Morale della storia:

<pre>
cd ~/git
git clone git://anongit.freedesktop.org/git/xorg/app/xcompmgr
./autogen.sh
make && cp xcompmgr ~/bin
xcompmgr -cC -o .3 &
</pre>

e Metacity. E, ovviamente, <a href="https://launchpad.net/awn">AWN</a> (che ha dei bug grandi così, ma posso rompere le scatole a Neil di persona).

  1. citazione colta []
  2. hint: <strong>non</strong> è gnome-compiz-manager []
Written by ebassi in: Linux, Software, compiz |
Sep
03
2007
8

Just a Ride

Dicevo <a href="http://log.emmanuelebassi.net/archives/2007/09/my-wandering-days-are-over/">altrove</a> di aver provato <a href="http://live.gnome.org/Vala">Vala</a>, il linguaggio C#-like scritto usando GLib e GObject come base, e che viene "compilato" in C invece di usare una <acronym title="Virtual Machine">VM</acronym> e un linguaggio intermedio1.

Ho trovato dei difetti nel layer di traduzione, ma sono dovuti essenzialmente alla giovane età del progetto, e il team di sviluppo sta raccogliendo intorno a sé una quantità di collaboratori più o meno saltuari che fa ben sperare. In più, la mera esistenza di Vala sta spingendo a completare il supporto per l’introspezione in GObject2.

Quello che più mi interessa, però, è la possibilità di avere un linguaggio a medio/alto ufficialmente sanzionato da GNOME – come Objective-C da Apple. Intendiamoci: la quantità di <em>binding</em> già presenti è enorme, e già oggi se volessi scrivere un’applicazione per GNOME potrei farlo in Perl, come in Java, come in C# e perfino con quel <em>train wreck</em> di Python3. Tuttavia, i bindings sono quello che sono: si portano dietro <em>virtual machine</em>, ambienti di <em>runtime</em>, licenze, implementazioni <em>patent encumbered</em> e altre amenità.

Intendiamoci: non ho nulla contro le <acronym title="Virtual Machine">VM</acronym> – a parte l’obiezione classica: "sto già usando una macchina virtuale su una macchina reale, perché devo usarne un’altra ancora per ogni linguaggio?"; tuttavia, e specie sulle macchine su cui lavoro, <strong>una</strong> <em>virtual machine</em> è già sufficiente – figuriamoci quattro o cinque. Mi piacerebbe che qualcuno prendesse Mono e ci portasse più di tre o quattro linguaggi; mi piacerebbe ancora di più che qualcuno prendesse <a href="http://en.wikipedia.org/wiki/Parrot_virtual_machine">Parrot</a> e lo completasse. Mi piacerebbe, insomma, avere <strong>una</strong> macchina virtuale per tutti i linguaggi ad alto livello. Se non posso averla, allora tanto vale usare Vala.

  1. si potrebbe arguire come, in realtà, la VM usata sia il sistema operativo ospite, e che sicuramente esistono più piattaforme con un compilatore C che piattaforme che supportano Java o C# []
  2. ovvero la possibilità di avere meta-informazioni a <em>runtime</em> su una libreria, sulle API e sui tipi di dati esportati []
  3. che, spero, Python 3.0 affosserà definitivamente con tutte le modifiche arbitrarie alle API senza vere nuove <em>feature</em>; non ci resta, quindi, che sperare in IronPython per una implementazione sana di mente? non voglio pensarci []
Aug
28
2007
6

Hysteria

O mio dio! Skype usa D-Bus, che usa <code>getpwnam (3posix)</code>, che apre <code>/etc/passwd</code>! Moriremo tutti!

O mio dio! La demo giocabile di un gioco già uscito installa un sistema per il <acronym title="Digital Restrictions Management">DRM</acronym> possibilmente scritto dalla stessa compagnia che aveva scritto un altro sistema per il <acronym title="Digital Restrictions Management">DRM</acronym> che aveva le caratteristiche di un <em>rootkit</em>! Moriremo tutti!

<em>L’isteria di massa del weekend è stata gentilmente offerta da blog e webforum e dal tam-tam della stessa gente che installa un firewall per sentirsi più sicuri – e poi magari blocca il DNS e pensa di essere stata "acherata". Chiunque campi sull’informatica non può che ringraziare questi fessi che permettono di portarsi a casa la pagnotta e non offrono alcun pericolo imminente di rimpiazzo.</em>

Written by ebassi in: Lusers, News, Rants, Software, stupidity |
May
14
2007
11

The Worst Joke Ever

Ho passato gli ultimi tre giorni a tentare di capire perché un pezzo di codice producesse un <code>SIGSEGV</code>. Ho cambiato linee, logica, tipi di dato. Niente: qualunque cosa facessi, solo crash. Come al solito, <code>gdb</code> si rivelava poco utile, mentendo spudoratamente sul luogo della violazione di memoria.

Oggi pomeriggio ho deciso di arrendermi e ho chiesto a Kris se poteva darmi una mano (dato che il <em>segfault</em> si verificava nel codice del <code>GtkTreeModelSort</code> che lui mantiene). Stasera mi dice di aver trovato la patch:

<pre>
Index: gtk/gtkfilechooserdefault.c
==============================================================
— gtk/gtkfilechooserdefault.c (revision 17846)
+++ gtk/gtkfilechooserdefault.c (revision 17848)
@@ -9508,7 +9508,7 @@ recent_column_path_sort_func (GtkTreeMod
if (!name_a)
return 1;

- if (!name_b);
+ if (!name_b)
return -1;

if (is_folder_a != is_folder_b)
</pre>

Penso che i miei moccoli siano arrivati vicinissimi al Moccolo a Delta di Dirac (dieci alla ventottesima madonne in un microsecondo).

<em>Va da sé che Kris si vedrà offrire una birra al GUADEC.</em>

Written by ebassi in: Diary, Linux, OpenSource, Software, gnome, gtk+ |
Mar
13
2007
14

Give It Up

La missione, se deciderete di accettarla, sarà di trovare la playlist nel prossimo Amarok:

<div style="text-align:center">
<a id="p1052" rel="attachment" class="imagelink" href="http://www.emmanuelebassi.net/archives/2007/03/give-it-up/amarok-2png/" title="amarok-2.png"><img id="image1052" src="http://www.emmanuelebassi.net/wp-content/amarok-2.png" alt="amarok-2.png" /></a>
</div>

Se verrete catturati, uccisi oppure vi butterete dalla finestra dall’orrore, il dipartimento negherà di essere a conoscenza della vostra missione.

Poi, a che diavolo serve il menu <em>Engage</em>? Cos’è, l’Enterprise?

Le motivazioni per utilizzare Amarok stanno scivolando sempre più verso il lombrosiano.

Written by ebassi in: Linux, OpenSource, Software, kde, stupidity |
Mar
06
2007
3

Next Year

<em>Attenzione: post ad elevato livello di sarcasmo</em>

È bello vedere gli amici di KDE pensare agli utenti, e <a href="http://www.ossblog.it/post/2115/la-storia-di-kde-e-dolphin">passare</a> a Dolphin. Certo che, potendo scegliere, non sarebber convenuto loro usare un file manager che <strong>non</strong> assomigliasse a Nautilus com’era cinque anni fa?

Ad ogni modo, il cerchio si chiude e si ritorna al 1999: KDE torna ad essere l’ambiente per i <em>corporate user</em>, transfughi di Windows, mentre GNOME torna ad essere il <em>desktop environment</em> <a href="http://pollycoke.wordpress.com/2007/03/06/tracker-delle-meraviglie-ecco-le-prossime-sciccherie/">pieno di crack</a>.

Written by ebassi in: Computer, Linux, OpenSource, Software, gnome, kde |
Feb
14
2007
2

Twist the Knife

<blockquote>
<strong>Panacea</strong>
<em>\Pan`a*ce"a\</em>, n.
[L., fr. Gr. pana`keia fr. panakh`s all-healing; pa^s pa^n, all + 'akei^sqai to heal.] [1913 Webster]
1. A remedy for all diseases; a universal medicine; a cure-all; catholicon; hence, a relief or solace for affliction. [1913 Webster]
2. (Bot.) The herb allheal. [1913 Webster]
3. (Programming) <a href="http://mail.gnome.org/archives/desktop-devel-list/2007-February/msg00202.html">Tracker</a>. [2007 Gnome]
</blockquote>

Okay, adesso si è andati talmente oltre il ridicolo che non è neppure più divertente. Gli autori ci si sono messi per la loro parte, ma adesso i <a href="http://mail.gnome.org/archives/desktop-devel-list/2007-February/msg00200.html">droni</a> stanno diventando davvero <a href="http://mail.gnome.org/archives/desktop-devel-list/2007-February/msg00203.html">fastidiosi</a>.

Jan
29
2007
16

Overdrive/1

Un recap sui progetti a cui sto lavorando al momento.

<h4>Clutter</h4>

Nei commenti al <a href="http://www.emmanuelebassi.net/archives/2007/01/the-body-says-no/">blog precendente</a> mi si chiedeva di Clutter. Per chi non seguisse Planet GNOME (o per chi lo seguisse ma non avesse comunque la più pallida idea di cosa si tratti), <a href="http://www.clutter-project.org">Clutter</a> è un toolkit che ho contribuito a realizzare più o meno da quando sono stato assunto alla OpenedHand (settimana più, settimana meno).

Clutter è un toolkit basato sulle stesse librerie usate per le GTK+ (GLib, GObject, Pango) ideato per scrivere applicazioni con un’interfaccia grafica mono-finestra – ad esempio: media box, personal video recorder, etc. – in ambienti (<em>embedded</em> e non) dotati di grafica accelerata (tramite <a href="http://en.wikipedia.org/wiki/OpenGL">OpenGL</a> oppure <a href="http://en.wikipedia.org/wiki/OpenGL_ES">OpenGL ES</a>). Clutter fornisce un <em>canvas</em>, rappresentato dal <em>singleton</em> <code>ClutterStage</code>, e alcuni <em>widget</em>, chiamati <code>ClutterActor</code>. I widget forniti sono (volutamente, al momento) pochi: non solo perché siamo alla release 0.2.0, ma soprattutto perché vogliamo vedere di cosa necessitano gli sviluppatori prima di implementare <code>ClutterActor</code> nel modo sbagliato o del tutto inutili.

<strong>Hello, World</strong> – Come funziona Clutter? Ecco un semplice <a href="http://devel.emmanuelebassi.net/software/hello-clutter.py">"hello, world"</a> che sfrutta buona parte delle nuove API. È scritto in Python – avrei preferito scriverlo in Perl, ma conoscendo la quantità di pythonisti in "ascolto" ho scelto altrimenti; la versione in Perl è disponibile a richiesta. Se volete, potete scaricarla e farci quello che volete – è nel <em>public domain</em>, come dovrebbero essere tutti gli "hello world" di questo mondo. Se cliccate dopo il link, smonto il codice in blocchi per spiegare come funziona.

<!–more–>

<pre>
<span style="color:purple">import</span> sys
<span style="color:purple">import</span> clutter
</pre>

Si parte importando i moduli, ovviamente. Il modulo <code>clutter</code> è fornito da <a href="http://www.clutter-project.org/sources/pyclutter/0.2/">pyclutter</a> e supporta tutta la <em>core library</em>; non appena riuscirò ad avere un po’ di tempo, e a domare le interazioni tra Python, GObject e GStreamer, pyclutter fornirà anche i binding per le estensioni multimediali disponibili (al momento) in C.

<pre>
<span style="color:orange">class</span> <span style="color:blue">HelloClutter</span>:
<span style="color:orange">def</span> <span style="color:blue">__init__</span> (self, message):
self.stage = clutter.stage_get_default()
self.stage.set_color(clutter.color_parse(<span style="color:red">’DarkSlateGrey’</span>))
self.stage.set_size(800, 600)
self.stage.connect(<span style="color:red">’key-press-event’</span>, clutter.main_quit)
self.stage.connect(<span style="color:red">’button-press-event’</span>,
self.on_button_press_event)
</pre>

Semplice classe per la nostra applicazione; inizializziamo tutto quando e cominciamo a creare lo <em>stage</em> principale su cui aggiungeremo i vari attori. Diamo una mano di "DarkSlateGrey" al palco, lo allarghiamo a 800 pixel per 600 e colleghiamo i due eventi che ci interessano: pressione di un tasto (a cui associamo l’uscita dal programma) e pressione di un pulsante del mouse (a cui associamo il metodo <code>on_button_press_event</code>).

<pre>
color = clutter.Color(0xff, 0xcc, 0xcc, 0xdd)
</pre>

Creiamo un colore, dandogli i valori dei quattro canali (rosso, verde, blu e alpha per l’opacità). Questo è uno dei vari modi che Clutter mette a disposizione per creare un colore. In alternativa, si può usare una stringa di testo (come sopra) che, però, non cambierà il valore dell’opacità di default; si può usare un intero senza segno da 32 bit (packed) come <code>0xffccccdd</code>; si può usare una conversione di <em>colorspace</em> da <acronym title="Hue Luminance Saturation">HLS</acronym> a <acronym title="Red, Green, Blue">RGB</acronym>.

<pre>
self.label = clutter.Label()
self.label.set_font_name(<span style="color:red">’Mono 32′</span>)
self.label.set_text(message)
self.label.set_color(color)
(label_width, label_height) = self.label.get_size()
label_x = self.stage.get_width() – label_width – 50
label_y = self.stage.get_height() – label_height
self.label.set_position(label_x, label_y)
self.stage.add(self.label)
</pre>

Dopo il palco, creiamo il primo attore: una semplice etichetta di testo. Decidiamo il font e il contenuto e posizioniamo l’attore a cinquanta pixel dall’estremo in basso a destra dello <em>stage</em>. Le dimensioni dell’etichetta vengono ricalcolate quando impostiamo il font e il testo, così da garantirci sempre dei valori aggiornati. Usando Pango, abbiamo gratis il supporto per l’internazionalizzazione delle stringhe, dei glifi, dei paragrafi, dell’ellissi dei testi, degli spazi e delle legature.

<pre>
self.cursor = clutter.Rectangle()
self.cursor.set_color(color)
self.cursor.set_size(20, label_height)
cursor_x = self.stage.get_width() – 50
cursor_y = self.stage.get_height() – label_height
self.cursor.set_position(cursor_x, cursor_y)
self.stage.add(self.cursor)
</pre>

Altro attore: il "cursore" alto quanto l’etichetta di testo, largo venti pixel e posto nell’estremo in basso a destra del nostro <em>stage</em>. Ora non ci resta che animarlo, facendolo lampeggiare.

<pre>
self.timeline = clutter.Timeline(30, 25)
self.timeline.set_loop(True)
alpha = clutter.Alpha(self.timeline, clutter.ramp_func)
self.behaviour = clutter.BehaviourOpacity(alpha, 0xdd, 0)
self.behaviour.apply(self.cursor)
</pre>

Per le animazioni ricorro ai "behaviour", i comportamenti che accennavo all’inizio del post. Per prima cosa, creo una timeline, ovvero una linea che dia il computo del tempo; la voglio di trenta frame, con 25 frame al secondo, e la voglio in <em>loop</em>.

Come seconda cosa, creo un <em>alpha</em>. Un <code>ClutterAlpha</code> è un oggetto che lega una timeline a una funzione; ad ogni "tic" della timeline, invoca la funzione e ottiene un intero senza segno che è dipendente solo dal tempo. In pratica, ingegneristicamente parlando, è un generatore di <a href="http://en.wikipedia.org/wiki/Waveform">forme d’onda</a> (mi rendo conto solo ora, cercandolo, che Wikipedia italiana non ha una pagina sui generatori di forme d’onda; gli ingeneri sono peggio degli idraulici: quando servono non ci sono mai).

Infine, creo un <em>behaviour</em>, ovvero un oggetto che controlla una o più proprietà di un set di attori usando l’oggetto alpha; in questo caso, un <code>ClutterBehaviourOpacity</code> che controlla l’opacità degli attori.

<pre>
<span style="color:orange">def</span> <span style="color:blue">on_button_press_event</span> (self, stage, event):
print <span style="color:red">"mouse button %d pressed at (%d, %d)"</span> % <span style="color:purple">\\</span>
(event.button, event.x, event.y)
</pre>

Questo è il callback del nostro evento, giusto per mostrare come ottenere i vari dettagli dall’oggetto <code>event</code>.

<pre>
<span style="color:orange">def</span> <span style="color:blue">run</span> (self):
self.stage.show_all()
self.timeline.start()
clutter.main()
</pre>

Il metodo <code>run</code> serve a:

<ul>
<li>mostrare tutti gli attori sullo <em>stage</em>;</li>
<li>avviare la timeline;</li>
<li>avviare il main loop;</li>
</ul>

In questo senso, Clutter funziona esattamente come le GTK+: il main loop gira ed esegue il dispatch degli eventi da X all’applicazione.

<pre>
<span style="color:orange">def</span> <span style="color:blue">main</span> (args):
<span style="color:orange">if</span> args:
message = args[0]
<span style="color:orange">else</span>:
message = <span style="color:red">’Hello, Clutter!’</span>

app = HelloClutter(message)
app.run()
return 0

<span style="color:orange">if</span> __name__ == <span style="color:red">’__main__’</span>:
sys.exit(main(sys.argv[1:]))
</pre>

Qui c’è la solita ferramenta necessaria per i programmi Python. Per avviare, basta eseguire:

<pre>
$ python hello-clutter.py "Ciao, mondo"
</pre>

<strong>Where do we go from here?</strong> – La versione 0.1 di Clutter, rilasciata l’anno passato, ha gettato le fondamenta per gli attori di base, ed è stata sufficiente per realizzare <acronym title="OpenedHand Presentation Tool">OPT</acronym>, un programma di presentazione usato da Ross Burton, da Jeff Waugh e dal sottoscritto al GUADEC di Vilanova. Per la version 0.2 abbiamo migliorato l’API, creato un renderer GL per Pango (riducendo l’utilizzo della memoria e aumentando la velocità e il supporto per l’internazionalizzazione) e aggiunto il supporto per i "comportamenti" (<code>ClutterBehaviour</code>) degli attori – ovvero un modo per animare i widget sul canvas. Purtroppo, a parte <a href="http://svn.o-hand.com/view/clutter/trunk/toys/opt/">OPT</a> non abbiamo notizia (al momento) di applicazioni che usino Clutter. Per questo ci farebbe piacere l’input della comunità, anche per sapere quali sono non solo i bug, ma anche le feature e le richieste che gli sviluppatori di applicazioni hanno; se voleste delle modifiche alle API per realizzare il prossimo rivale di MythTV (la cui interfaccia, diciamocela tutta, va bene a duemila <em>geek</em>, ma se la vedono gli utenti che hanno difficoltà a cambiare l’ora del videoregistratore abbiamo diecimila utenti che si buttano dalla finestra dall’orrore), oppure se avete dei bug da segnalare, basta aprire un ticket su <a href="http://bugzilla.o-hand.com/enter_bug.cgi?product=Clutter">Bugzilla</a>.

<em style="font-size:80%">continua…</em>

Written by ebassi in: Linux, Software, clutter, gnome, hacking, work |

Powered by WordPress | Theme: Aeros 2.0 by TheBuckmaker.com