mercoledì 20 febbraio 2013

Chromix III - PanMenu and Go !

Segue dalla puntata precedente.

 

Un buon Menu


Siamo giunti agli ultimi passaggi del progetto Chromix e ci serve il Menu.

Ma Perché ci serve un Menu ?


Ci serve perché il Menu di LXDE così come la maggior parte dei Menu delle varie interfacce grafiche, è studiato per far funzionare un Desktop e attinge alle relative applicazioni, mentre il nostro obiettivo è creare qualcosa di semplice che si interfacci con le Web-App di Chromium.

Devo dire che dopo molte titubanze, tipo la ricerca di un plugin adatto o l'idea di scriverlo, mi è venuto in mente che in fondo la cosa più facile era fare uno  scriptino in Python.

Uno scriptino in Python ?  


Si uno scriptino che usasse Python e le GTK, con tanto di supporto CAIRO.

Per installare ciò che ci serve occorre usare il terminale di root cioè quello rosso e poi dare il comando :

apt-get install python-gtk

e per quanto riguarda le operazioni come root abbiamo finito.

Aperto un terminale normale, invece creiamo due folder nascosti come chromix nella nostra HOME :


mkdir .panmenu
mkdir .menu
cd .panmenu

E siamo dentro la neonata cartella dove dobbiamo scrivere (se vogliamo con leafpad) il primo file che si chiama config e che contiene la configurazione del pannello :

Potrebbe essere  :

bottom=50
minrows=3
maxrows=8
mincols=3
maxcols=12
Altra riga accettata da questo file è defaulticon che indica il nome dell'icona di default, la quale se non indicata diventa /.local/share/icons/default.png.

Nella stessa cartella dobbiamo inserire l'icona del programma che si chiama panmenu.png , io ho scelto questa :



La stessa icona la potete copiare con un :

mkdir ~/.local/share/icons
cp panmenu.png  ~/.local/share/icons/default.png

Oppure potete sceglierne una completamente diversa.

Ora aggiungiamo il link chiamato : panmenu.desktop e scriviamo le seguenti righe di testo :

[Desktop Entry]
Version=1.0
Name=PanMenu
Comment=MenuPanel
Exec=/home/chromix/.panmenu/panmenu
Terminal=false
X-MultipleArgs=false
Type=Application
Icon=/home/chromix/.panmenu/panmenu.png

Lo script


Dopo avere aggiunto le parti secondarie arriviamo ora al vero e proprio pannello in python-gtk il cui codice è questo :


#!/usr/bin/python
#
#  PANMENU
#  A simple menu panel for Linux written in Python GTK
#
#  Copyright 2013 by ElDuraMinga (elduraminga.blogspot.com)
#
#  This program is free software: you can redistribute it and/or modify
#  it under the terms of the GNU General Public License as published by
#  the Free Software Foundation, either version 3 of the License, or
#  (at your option) any later version.
#
#  This program is distributed in the hope that it will be useful,
#  but WITHOUT ANY WARRANTY; without even the implied warranty of
#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#  GNU General Public License for more details.
#
#  See <http://www.gnu.org/licenses/>.
#

import pygtk
import gtk
import os
import fileinput
import gtk, gobject, cairo

global inside
inside=False

global page
page=0

global profile,home,folderlist

home=os.getenv("HOME")
folderlist=[]

global GLX,GLS
GLX=64
GLS=48

global bottom,minrows,mincols,maxrows,maxcols,defaulticon

bottom=0
minrows=5
mincols=3
maxrows=8
maxcols=8
defaulticon=home+"/.local/share/icons/default.png"


global nRows,nCols,nIndex,nCount
nRows=0
nCols=0
nIndex=-1
nCount=0

global pixmaps
pixmaps=[]


#Check single instance
def singleInstance() :
  if os.access("/run/lock/panmenu.lock",os.F_OK):
    quit()
  else :
    f=open("/run/lock/panmenu.lock","w")
    f.close()

def killInstance() :
  os.unlink("/run/lock/panmenu.lock")


# Read Global Profile
def profileRead() :
  global bottom
  global minrows
  global mincols
  global maxrows
  global maxcols
  global defaulticon
  global home
  for i in fileinput.input(home+"/.panmenu/config") :
    v=i.strip().split('=')
    if len(v)==2 :
      if (v[0]=='bottom') :
        bottom=int(v[1])
      if (v[0]=='minrows') :
        minrows=int(v[1])
      if (v[0]=='maxrows') :
        maxrows=int(v[1])
      if (v[0]=='mincols') :
        mincols=int(v[1])
      if (v[0]=='maxcols') :
        maxcols=int(v[1])
      if (v[0]=='defaulticon') :
        defaulticon=v[1]

def checkIcon( iconname ) :
    global defaulticon
    global home
    for dirname, dirnames, filenames in os.walk(home+"/.local/share/icons"):
      for i in filenames :
        if i[:len(iconname)]==iconname :
          return dirname+"/"+i
    return defaulticon



def parseApplicationFile( name ) :
  global folderlist
  fname=""
  ficon=""
  fexec=""
  for i in fileinput.input(name) :
    v=i.strip()
    if v[:5]=="Icon=" :
      if v[5]=='/' :
        ic=v[5:]
      else :
        ic=checkIcon(v[5:]+".png")
      ficon=ic
    if v[:5]=="Exec=" :
      fexec=v[5:]
    if v[:5]=="Name=" :
      fname=v[5:]
  folderlist.append([fname,ficon,fexec]) 
   

#Read the local applications directory
def applicationsRead() :
  global home
  dirlist=os.listdir(home+"/.menu")
  dirlist.sort()
  for i in dirlist :
    j=home+"/.menu/"+i
    if (os.path.isfile(j)) :
      if (i[-8:]==".desktop") :
        parseApplicationFile(j)
  dirlist=os.listdir(home+"/.local/share/applications")
  dirlist.sort() 
  for i in dirlist :
    j=home+"/.local/share/applications/"+i
    if (os.path.isfile(j)) :
      if (i[-8:]==".desktop") :
        parseApplicationFile(j)
       

def iconShow(surface,cr,x,y,w,h,alpha) :
    cr.save(); 
    width = surface.get_width()
    height = surface.get_height()   
    width=w/width;
    height=h/height;
    cr.scale(width, height);
    cr.set_source_surface(surface, x/width, y/height)
    if alpha :     
      cr.paint_with_alpha(0.5)
    else : 
      cr.paint();
    cr.restore();



# Create a GTK+ widget on which we will draw using Cairo
class Screen(gtk.DrawingArea):

    # Draw in response to an expose-event
    __gsignals__ = { "expose-event": "override" }

    # Handle the expose-event by drawing
    def do_expose_event(self, event):

        # Create the cairo context
        cr = self.window.cairo_create()

        # Restrict Cairo to the exposed area; avoid extra work
        cr.rectangle(event.area.x, event.area.y,
                event.area.width, event.area.height)
        cr.clip()

        self.draw(cr, *self.window.get_size())

    def draw(self, cr, width, height):
        global iconlist
        global nIndex
        j=page
        for i in range(nRows*nCols) :
          cx=GLX*((i%nCols)+1);
          cy=GLX*((i/nCols)+1);
          if (nIndex==j) :
            iconShow(folderlist[j][3],cr,float(cx-GLS/2),float(cy-GLS/2),float(GLS),float(GLS),True);
          else :
            iconShow(folderlist[j][3],cr,float(cx-GLS/2),float(cy-GLS/2),float(GLS),float(GLS),False);
          j+=1 
          if (j>=len(folderlist)) :
            break 
        if nIndex!=-1 : 
          cr.save(); 
          cr.set_source_rgb(0, 0, 0)
          
          cr.select_font_face("Nimbus Sans L", cairo.FONT_SLANT_NORMAL,cairo.FONT_WEIGHT_NORMAL)
          cr.set_font_size(20)
         
          cr.move_to(GLX/2, height-26)
          cr.show_text(folderlist[nIndex][0]) 
          cr.restore(); 
         

def motionEvent(widget, event):
  global folderlist
  global nIndex
  global inside
  inside=True
  j=page
  q=-1
  for i in range(nCols*nRows) :
    cx=GLX*((i%nCols)+1);
    cy=GLX*((i/nCols)+1);   
    if ( (event.x>=float(cx-GLX/2)) and (event.x<=float(cx+GLX/2)) and (event.y>=float(cy-GLX/2)) and (event.y<=float(cy+GLX/2)) ) :
      q=j
      break;
    j+=1
    if (j>=len(folderlist)) :
      break
  if (q!=nIndex) :
    nIndex=q
    widget.queue_draw();   
  return True

def buttonEvent(widget, event):
  global nIndex 
  global folderlist
  global page
  if event.type == gtk.gdk.BUTTON_PRESS  :
    if event.button == 1:
      killInstance()
      if (nIndex!=-1) :
        os.execl("/bin/sh","/bin/sh","-c",folderlist[nIndex][2]);
      gtk.main_quit()
    if event.button == 3:
      page+=nCols*nRows
      if page>=len(folderlist) :
        page=0
      widget.queue_draw()
  return True



def quitAll(widget, event):
  global inside
  if inside :
    killInstance()
    gtk.main_quit()
    return True
  
# Panel intialization and run
def run(Widget):
    global nRows
    global nCols
    global nIndex
    global nCount
    global folderlist
    global iconlist
   
    nRows=minrows
    nCols=mincols
    nCount=len(folderlist)
   
    while (nRows*nCols<nCount) :
      nRows+=1;
      if (nRows>maxrows) :
        nCols+=1;
        nRows=minrows
      if (nCols>maxcols) :
        nRows=maxrows
        nCols=maxcols
        nCount=nRows*nCols;
        break; 
       
       
    for i in folderlist :
      try:
        f = cairo.ImageSurface.create_from_png(i[1])
      except Exception, e:
        f = cairo.ImageSurface.create_from_png(defaulticon)
      i.append(f)
 
    window = gtk.Window()
    window.connect("delete-event", quitAll)
    widget = Widget()
    widget.show()
    window.add(widget)
   
   
    widget.connect("motion_notify_event", motionEvent)
    widget.connect("button_press_event", buttonEvent)
    widget.connect("leave_notify_event", quitAll)

    widget.set_events(gtk.gdk.EXPOSURE_MASK
                            | gtk.gdk.LEAVE_NOTIFY_MASK
                            | gtk.gdk.BUTTON_PRESS_MASK
                            | gtk.gdk.POINTER_MOTION_MASK
                            | gtk.gdk.POINTER_MOTION_HINT_MASK)
   
   
   
    color = gtk.gdk.Color(red=65535, green=65535, blue=65535, pixel=0)
    window.background=color
    window.resize(GLX*(nCols+1), GLX*(nRows+1)+32);
    window.move(5, gtk.gdk.screen_height() - bottom - 32 - GLX*(nRows+1));
    window.present()
    window.set_name ("menupanel")
    window.set_title("Menu Panel")
    window.set_decorated(False)
    gtk.main()
   
if __name__ == "__main__":
    singleInstance()
    try :
      profileRead()
      applicationsRead()
      run(Screen)
    except e:
      killInstance()



Lo dovete copia-incollare dentro un file chiamato panmenu nella stessa cartella, menù e renderlo eseguibile tipo :

chmod 755 panmenu


Come funziona PanMenu


Panmenu recupera le applicazioni dai desktop link contenuti in .menu, cioè quelle che aggiungeremo noi e .local/share/applications che invece sono quelle che aggiunge Chromium, ossia le web-app.

Entrambi andranno a reperire le icone relative in .local/share/icons . Notare che questo menù non usa le libmenu, ma fa per conto suo ed è estremamente dinamico.

Il suo funzionamento è la costruzione di una finestra a sinistra in basso BOTTOM righe sopra l'ultima linea, individuando la serie di icone del pannello mettendole in ordine alfabetico, infine visualizzando un rettangolo che si estende da MINROWS MINCOLS a MAXROWS MAXCOLS, in modo progressivo.

Oltre il termine di MAXROWS/MAXCOLS si procede a pagine e per andare sulle successive si usa il Right-Click del mouse a rotazione.

Il pannello scompare quando si esce dal menu col mouse o quando si preme su un link, nel qual caso viene usato un execl con sh per lanciare il comando, che resta così regolarmente "figlio" del pannello.

Nota : Se il menù non si apre più controllare ed eventualmente rimuovere il lock per l'istanza singola : /run/lock/panmenu.lock


Integrare PanMenu nel launcher di LXDE

 

Per prima cosa, con leafpad si va a modificare il file :

 ~/.config/lxpanel/LXDE/panels/panel

Aggiungendo al primo launcher una altro Button, col seguente codice :



...
Plugin {
    type = launchbar
    Config {
        Button {
            id=/home/chromix/.panmenu/panmenu.desktop
        }
        Button {
            id=/usr/share/applications/chromium.deskto       
        }
    }
}
...


poi dobbiamo fare in modo che l'applicazione non sia visualizzata nella taskbar, modificando opportunamente la configurazione di openbox cioè il file :

~/.config/openbox/lxde-rc.xml

aggiungendo in fondo, prima della chiusura del tag XML </applications> quattro righe:

...
  # end of the example
-->

    
 <application name="panmenu" >
   <skip_taskbar>yes</skip_taskbar>
   <skip_pager>yes</skip_pager>
 </application>

  </applications>
</openbox_config>
...

Ora non ci resta che popolare, con due applicazioni di base il .menu e per far questo diamo la sequenza dei comandi :

cd ~/.menu
cp /usr/share/applications/lxterminal.desktop .
cp /usr/share/applications/pcmanfm.desktop .
cd ~/.local/share/icons/
cp /usr/share/icons/nuoveXT2/48x48/apps/terminal.png lxterminal.png
cp /usr/share/icons/nuoveXT2/48x48/apps/file-manager.png system-file-manager.png
Cioè copiamo sia il link a queste due applicazioni (in .menu) che le relative icone (in .local/share/icons), come indicate all'interno dei link.

Abbiamo scelto icone 48x48 che è la dimensione standard per il menu.

Siccome non sono accettate le sostituzioni tipo %U nei links, andiamo nuovamente in .menu e sostituiamo la riga di exec di pcmanfm.desktop con :

...
Exec=pcmanfm ~/Downloads
...

A questo punto possiamo riavviare.

 Riavvio


Se avete fatto i regolari passaggi, cliccando sul nuovo launcher nel pannello del menù vedrete qualcosa tipo :






Facendo click sul file manager per altro, entreremo direttamente in Downloads, dove ci si aspetta che Chromium metta ciò che scarichiamo.

Inoltre sul tab sinistro di pcmanfm troviamo Applications , se clicchiamo qui, scopriamo che si tratta di un altro menu completo da cui possiamo avviare tutte le applicazioni installate :



dunque possiamo rimuovere quello sul pannello e lasciare solo il nostro PanMenu e Chromium.


 

 

Aggiungere Web-Apps e Links


Se apriamo Chromium sulla new-tab classica, dovremmo trovare l'elenco di tutte le applicazioni che abbiamo integrato.

All'inizio c'è solo il Chrome Web Store che però è un Web-App come tutte le altre dunque possiamo benissimo inserirlo come applicazione.

Per farlo clicchiamo col tasto destro sull'icona stessa e scegliamo Create Shortcuts :



Qui scegliamo di mettere il link nel menu e non sul desktop.



Ora, se andiamo a vedere il nostro menù, sarà diventato così :



E potremo lanciare l'applicazione come se fosse locale :




Come possiamo osservare nella finestra non c'è alcuna barra e l'icona nella taskbar non è quella di Chromium ma dello store !

Questo ovviamente, si può fare con tutte le applicazioni che vogliamo e ciò è abbastanza grandioso.

Ma c'è molto altro, tipo inserire un LINK come se fosse una web-app, con l'unico problema che l'icona sarà quella dello standard web di solito 16x16, poi scalata di tre volte.

Comunque apriamo Chromium , andiamo su un sito tipo www.twitter.com e clicchiamo sul menù di Chromium , sotto Tools troviamo Create Application Shortcut .



Stessa operazione di prima, cioè creazione del link non sul desktop ma nel menu ed ecco il nostro nuovo menu con l'uccellino.



 

Ed ecco il nostro Chromix



Abbiamo praticamente concluso il lavoro su Chromix.

Se volete, potete portare avanti piccole rifiniture, tipo cambiare la PNG che sta in /usr/share/lxde/images/logout-banner.png, con l'icona di Chromium 256x256, in modo da avere un menu di chiusura più raffinato e tante altre cose che lascio fare a voi.

Per ora arrivederci.






Chromix II - The making of

Segue dalla puntata precedente.
 
Dopo avere capito cosa è Chromix vediamo di installarlo, cioè di installare Debian, e trasformarla in Chromix.

La scelta

Allo stato attuale sta per uscire la Debian Wheezy, ma siamo ancora a Squeeze cioè la 6.0, anzi per l'esattezza la 6.06.

Ho detto che Chromix dovrebbe essere una rolling release cioè un qualcosa che si aggiorni in eterno, però dovremmo limitare il più possibile i cambiamenti radicali di versione del software, a parte quelli di Chromium che è il core di Chromix.

Infatti per lavorare coerentemente, dovremo modificare diversi script e quando cambiamo la "versione" dei pacchetti, ci potrebbe essere richiesto di fare un merge a mano tra la vecchia e la nuova versione. Questo accade piuttosto raramente ma può accadere.

Per ovviare a questi inconvenienti restiamo su Wheezy per poi pensare a cambiare il tutto fa 4 anni, mentre vedremo di avere gli aggiornamenti veloci del browser in altro modo.

Base


Scaricata la versione netinst di Debian 6, si può copiare su una chiavetta, inserirla nel NetBook e iniziare il boot.

L'idea è ovviamente quella di rimuovere tutto ciò che c'era prima e installare la "base", cioè eseguire la classica installazione full disk.

È importante scegliere il giusto file system per la partizione, visto che di solito Debian è indietro (attualmente formatta ext3, mentre per tutti è meglio ext4).

È essenziale invece creare oltre al classico utente root  anche l'utente :

chromix  

che sarà il nostro utente di autologin.

La password di chromix non ha molta importanza, perché ne avrà di più quella del ring.

Arrivati in fondo sceglieremo solo la base, cioè Laptop e Standard system utilities :


Se abbiamo fatto tutto bene, partiremo dalla linea di comando loggandoci come root ed a quel punto potremo decidere di aggiornare e continuare se siamo già in Wheezy o di cambiare /etc/apt/sources.list e metterci wheezy al posto di squeeze se siamo partiti da Squeeze.

Sperando che sia tutto chiaro, alla fine per essere sicuri diamo :

apt-get update
apt-get dist-upgrade
apt-get autoremove 

Così mettiamo a posto le pendenze.

Una volta riavviato il sistema avremo la nostra base già pronta.

I pacchetti di Chromix


La base dei pacchetti di Chromix è molto semplice. Ovviamente poi potremo aggiungere quello che ci piace ma l'essenziale è :
apt-get purge xscreensaver
apt-get install lxde
apt-get install alsa alsa-oss oss-compat
apt-get install feh

apt-get install evince
apt-get install ffmpeg
apt-get install chromium
apt-get install flashplugin-nonfree
apt-get autoremove
 

Al termine dell'aggiornamento riavviamo ed eseguiamo il login come chromix .

Al primo impatto ciò che dovremmo ottenere è questo :


E ciò ci fa intuire che ci dovremo lavorare un po` su.

Modifiche al pannello

 

Premetto che presto presenterò un menu degno di questo nome ma per il momento mettiamo a posto il pannello nel modo più semplice.

Per far questo col tasto destro sul pannello, scegliamo Panel Settings e ci troviamo una dialog con alcuni tab, i quali sono da impostare in questo modo :

Portiamo la dimensione delle icone e della barra a 48 pixel :


Poniamo uno sfondo trasparente :


Modifichiamo nel la sequenza dei plugin del pannello con Add,Remove, Up e Down in questo modo :


Usando Edit invece, si possono modificare le due Application Launch Bar e la Task Bar.

Nella prima Application Launch ci mettiamo solo Chromium :


Nella seconda, quella in fondo, lasciamo solo il Logout :


La TaskBar invece la trasformiamo in questo modo :

 
Così facendo, abbiamo una bellissima barra trasparente con solo le icone.

A questo punto lasciamo le impostazioni del pannello e dal menù andiamo su Preferenze per impostare il tema di OpenBox.

Io ho scelto ClearLook-3.4 che e in linea con la barra di Chromium :



L'ultima modifica è Dektops, dove mettiamo un desktop solo :



Modifiche di sistema

Bene, fatte le modifiche come utente chromix, tra li accessori ci dovrebbe essere un terminale rosso di amministrazione (root) da usarsi per modificare i files di sistema.

Da questo terminale è possibile lanciare senza difficoltà anche leafpad che è l'editor di testi di LXDE.

Prima però dobbiamo scegliere una immagine di sfondo, per far questo apriamo Chromium e cerchiamo su Internet una bella immagine, possibilmente di risoluzione in linea col nostro schermo che per un normale netbook è 1024x600.

Trovata l'immagine mettiamola nella home di chromix , poi con il file manager rinominiamola come .background.img . È molto importante ricordarsi il . all'inizio e se avete fatto le cose correttamente, l'immagine dovrebbe "sparire".

Ora dal terminale rosso andiamo a modificare il file di autostart e cioè diamo :
 
leafpad /etc/xdg/lxsession/LXDE/autostart

Bene. Il file deve essere cambiato così :
@xset s 120
@feh --bg-scale ~/.background.img
@lxpanel --profile LXDE 

La prima riga imposta lo screen saver di risparmio energetico sui due minuti di inattività .

La seconda sostituisce il desktop con il solo background e impedisce di metterci icone (pur lasciando la cartella Desktop).

La terza dovrebbe già esserci e lancia il pannello. È come vediamo una configurazione estremamente minimale.

Il programma feh visualizza solo l'immagine, tuttavia OpenBox continua comunque a mostrarci il suo menu col tasto destro.

Opzionale :
 
Per ovviare a questo inconveniente antiestetico, potremmo agire aprendo normalmente leafpad da chromix e modificando il file :

~/.config/openbox/lxderc-xml

Per eliminare tutti i blocchi con riferiementi a :

<action name="ShowMenu"> 
 
ma se non siete preoccupati per un comodo menù, lasciate pure perdere.

Autologin

Dopo avere modificato l'autostart di LXDE vediamo come impostare l'Autologin, il Power Management e Chromium.

Tanto per iniziare, considerando un solo sistema operativo, non abbiamo bisogno del menù di GRUB. Per modificarlo occorre dal terminale root (quello rosso) editare con leafpad il file :


/etc/default/grub

e modificare nelle le prime righe :
 
GRUB_DEFAULT=0
GRUB_TIMEOUT=0

io ho anche tolto il commento a :
 
GRUB_TERMINAL=console

Per salvare la configurazione usiamo l'apposito script e diamo con attenzione :
 
grub-mkconfig >/boot/grub/grub.cfg

Il nuovo file, dovrebbe far partire GRUB automaticamente.

Per quanto riguarda l'autologin di lightdm, c'è invece uno script molto nascosto, che modifica /etc/lightdm/lightdm.conf  e si può lanciare in questo modo :

/usr/lib/i386-linu-gnu/lightdm/lightdm-set-defaults --autologin chromix

e il gioco è fatto.

 Power Management


Dunque, abbiamo già ridotto il tempo di accensione del display a 2 minuti di inattività, ora però dobbiamo modificare due parametri essenziali, il primo è la policy del governor e il secondo è la chiusura del LID.

Da quando sono stati introdotti i sistemi per la gestione dell'energia nelle CPU, Linux ha incominciato ad adottare alcuni algoritmi per controllarne la frequenza.

Gli algoritmi sono sostituibili in run time e sono chiamati governor, attualmente ce ne sono 5 :  userspace, conservative, powersave, ondemand, performance.


Tra questi i due interessanti sono ondemand e conservative. 

La differenza tra i due è che il primo, molto usato, pur facendo funzionare il computer alla minima frequenza, appena si opera al 100%, scala alla massima frequenza, mentre il secondo per arrivarci scala lentamente per tutti gli steps disponibili.

La seconda soluzione sarebbe più corretta ma a volte, specie se gli steps sono molti come in un ARM,  è un limite per la rapidità di risposta all'operatore.

Qui useremo comunque conservative, che su un ATOM e in un NetBook va più che bene.

Prima accertiamoci del numero e delle frequenze di lavoro dei nostri core CPU e per questo che lanciamo :

cpufreq-info 

con questo io ho osservato che il mio netbook è "scarsino", ha due core, cioè CPU0 e CPU1 e i seguenti hardware limits :

-->
hardware limits: 800 MHz - 1.60 Ghz


Dal terminale di root (sempre quello rosso), modifichiamo il file jolly per le impostazioni di sistema cioè /etc/rc.local .

Io ho inserito quindi prima di exit 0 le seguenti righe :

-->
export PATH=$PATH:/bin:/sbin:/usr/bin:/usr/sbin
cpufreq-set -c 0 -g conservative -d 800Mhz -u 1.6Ghz
cpufreq-set -c 1 -g conservative -d 800Mhz -u 1.6Ghz
exit 0

Che mi sembrano autoesplicative o quanto meno nulla che un semplice man non possa chiarire.

Resta il problema del LID cioè dello sportello (cioè quando chiudete il computer) che per default non lo manda in sleep, ma spegne solo la retroilluminazione del display.

Ciò può essere brutto, specie per un NetBook ma anche per un Notebook ed è probabilmente retaggio di tempi oscuri, in cui il power management non funzionava e il computer, una volta andato in sleep, non si svegliava più.
-->

Si può modificare per questo il file :


/etc/default/acpi-support


con le seguenti impostazioni :


# Comment the next line to disable ACPI suspend to RAM
ACPI_SLEEP=true

# Comment the next line to disable suspend to disk
ACPI_HIBERNATE=true

# Use Radeontool to switch the screen off? Seems to be needed on some machines
# RADEON_LIGHT=true

# Comment this out to disable screen locking on resume
# LOCK_SCREEN=true

# Uncomment this to enable ACPI sleep when the lid screen is closed.
LID_SLEEP=true


Sul mio NetBook NON HO una RADEON, quindi RADEON LIGHT è commentato.

L'importante è ovviamente LID_SLEEP=true, gli altri sono aggiustamenti.

Dovremmo quasi esserci, ci manca solo la modifica di Chromium.

Chromium Settings

-->

Alcuni si sorprenderanno nel sapere che Chromium dispone di decine di switches in linea di comando, che possono abilitare e disabilitare anche funzionalità avanzate e non presenti nelle impostazioni generali.

Per esempio su un NetBook con autologin come il nostro, sarebbe indispensabile proteggere in qualche modo le proprie passwords.

In questo caso, mentre Firefox consente l'uso di una password di sblocco principale che decripta le altre, Chromium o usa sqlite in chiaro o i tools di sistema che si chiamano gnome-ring o kwallet.

Non stiamo usando KDE, però tra i pacchetti di LXDE c'è gnome-ring.

Il problema vero è che mentre sarebbe facile modificare il launcher di Chromium, per metterci gli switches, i link alle web-apps in Linux sono generabili automaticamente da Chromium e non ci mette quei flags.

Tuttavia esiste una variabile di sistema poco nota, che possiamo inserire in /etc/environment, un file che nell'installazione standard di Debian non dovrebbe ancora esistere o essere vuoto.

Quindi apriamolo e scriviamoci :

CHROMIUM_USER_FLAGS="--password-store=gnome"

e tutta la serie di altri flags che ci piace di più. 

Io per esempio disabilito il sync di Google con -–disable-sync in modo che non me lo chieda nemmeno.

Se facciamo questo ci conviene definire una password piuttosto complessa per gnome-ring e diversa dalla classica password di login che è automatico, quindi dobbiamo "uccidere" il keyring dal terminale di root con :

killall gnome-keyring-daemon

e ripulire la cartella keyring dell'utente :

rm -r /home/chromix/.gnome2/keyrings/*

o direttamente dal suo terminale (non root) con rm -r ~/.gnome2/keyrings/* .

Così la prima volta che si accederà ad una pagina di login, vedremo spuntare la richiesta della prima password di keyring, che non dobbiamo dimenticare mai perché le altre volte che facciamo reboot ce la richiederà.


Aggionamenti


Abbiamo detto che il nostro target è di non aggiornare spesso il sistema operativo nel suo insieme, tuttavia è quasi indispensabile tenere aggiornati Chromium e Flash per esempio, oltre ad eventuali altri plugins messi a disposizione da Debian.

Per fare questo useremo un trucchetto particolare che potrebbe rilevarsi molto interessante.

Apriamo il terminale di root (quello rosso) e andiamo nella cartella :

cd /etc/apt/preferences.d

A questo punto scriviamo due files contenenti tre righe :


00Default

Package: *
Pin: release a=wheezy
Pin-Priority: 900

10Testing

Package: *
Pin: release a=testing
Pin-Priority: -100

Questo sta ad indicare che lasciamo aperta la strada a due profili, il principale con priorità 900 è il Default che è esplicitamente wheezy, mentre il secondario che deve essere attivato su specifica richiesta e con priorità -100 è il Testing che è rolling ma potrebbe anche essere la sid.

L'unica aggiunta che dobbiamo fare è a questo punto nel file :

/etc/apt/sources.list 

che ormai conosciamo molto bene, per aggiungere la riga :


...
deb http://<debian mirror>/debian testing main contrib non-free
...
 

cioè una riga sul repository di testing.

Così facendo, potremo continuare ad usare :

apt-get update
apt-get upgrade

per aggiornare il sistema di Wheezy, ma parallelamente saremo anche in grado di aggiornare solo uno o più pacchetti alla versione più nuova della testing, per esempio con :


apt-get update
apt-get install -t testing chromium-browser chromium-browser-l10n  flashplugin-nonfree

Autoupdate al Boot


Chrome OS, esegue automaticamaente un aggiornamento al boot, se trova pacchetti più nuovi.

Siccome non ci facciamo mancare nulla possiamo provare a farlo anche noi con una particolare avvertenza, cioè che potrebbe non funzionare, quindi stiamo un attimino attenti.

Bene, ora che ci siamo capiti andiamo nella cartella :
cd /usr/local/sbin
e inseriamo uno script autoupdate, tipo questo :


#!/bin/bash
function realUpdate
{
    /bin/sleep 120
    /usr/bin/apt-get update -q=2
    /usr/bin/apt-get install -q=2 --download-only -t testing $(</usr/local/etc/testing.package)
}
/usr/bin/apt-get install -q=2 --no-download -t testing $(</usr/local/etc/testing.package)
realUpdate &


Infine inseriamo prima di exit 0 in /etc/rc.local la seguente riga :

...
/usr/local/sbin/autoupdate
exit 0
e la lista di pacchetti speciali da aggiornare tutti in fila nel file :

/usr/local/etc/testing.package
con un contenuto tipo appunto :
chromium-browser  chromium-browser-l10n  flashplugin-nonfree

Cosa fa tutto ciò ?


Ho suddiviso il funzionamento in due parti, prima l'installazione sincronizzata con lo startup di sistema e poi l'aggiornamento dopo due minuti.

Questo è più o meno il sistema usato da windows quando fa aggiornamenti importanti, cioè scarica gli aggiornamenti eventuali e li installa allo startup nella fase successiva.


In questo modo si incrementa la sicurezza che non si spenga il computer durante l'installazione, sebbene l'installazione stessa avvenga in background in quanto come sappiamo, nelle nuove versioni di Debian, l'init di sistema non è più sequenziale.


Dopo due minuti dalla partenza del invece, quando si suppone che la rete sia pronta, lo script tenta di scaricare eventuali aggiornamenti disponibili rigorosamente in background e li lascia lì per il prossimo riavvio.


Questo avviene solo per i pacchetti indicati nel file : /usr/local/etc/testing.package, gli altri si possono aggiornare dal terminale di root con il classico :


apt-get upgrade 

Nel caso invece qualcosa non funzioni sappiamo che c'è sempre :

dpkg --configure -a

eccetera.



E infine il riavvio

 

Terminati tutti questi passaggi possiamo riavviare e dopo l'autologin otterremo questo :


Il sistema non è ancora completo, perchè una interessante capacità di Chromium è quella di creare links alle Web-Apps e agli URL come se fossero applicazioni.

Ci servirà un menù degno di questo nome, in grado di gestire sia le applicazioni native che quelle web e vedremo di procurarcelo in qualche modo, ovviamente nella prossima puntata.








mercoledì 13 febbraio 2013

Chromix I - A History Of NetBooks

NetBooks

 

Qualche anno fa, sul mercato furono lanciati una serie di computer destinati ad essere il futuro della comunicazione mobile, cioè i NetBooks.

Dopo qualche mese, esattamente come mi capitò di prevedere, il lancio divenne letterale e cambiarono destinazione d'uso, diventando pratici fermaporta, livellatori per tavolini o portatovaglioli.

Molti affermano che il dramma di questi oggetti fu la nascita del mercato dei Tablet e questo è certamente vero, tuttavia per vedere le cose dal giusto punto di vista dovremmo considerare anche la loro storia, l'indecente campagna di marketing che ne seguì e le relative implementazioni techologiche.

Infatti l'idea di ciò che è chiamato oggi NetBook nacque come realizzazione dal sogno di Negroponte di costuire PC a 100$, con Linux per paesi in via di sviluppo, oggetti che una volta realizzati furono ribaltati sul mercato occidentale con Windows ad un prezzo paragonabile, se non superiore, a quello di un NoteBook da 15 o 17 pollici.

Per ottenere implementazioni compatibili con tecnologia i386, si usarono processori ATOM che avevano un buonissimo livello di consumo a parità di prestazioni, però le celle delle batterie furono ridotte (cioè 6 celle invece di 12 o 18) e così l'autonomia divenne di due ore scarse, inferiori a quelle di un NoteBook della stessa fascia di prezzo.

Queste ed altre fantastiche soluzioni tecnologiche, li resero di fatto dei semplici soprammobili, tranne che per alcuni modelli come il Samsung che riusciva ad offrire una autonomia normale per un sistema mobile di 9 ore ma aveva costi molto più elevati.

ChromeBooks


Alcuni anni dopo, mentre la Microsoft scatena il suo nuovo Windows8 - Surface, un po`tablet e un po`NoteBook, dando un addio alla tecnologia Intel a favore la tecnologia ARM e mentre la Samsung realizza ibridi di varia natura, la grande G che ospita anche questo blog autarchico, dopo aver svezzato Android, riprende l'idea del Full-Cloud, con il suo progetto Chrome-Os cioè un sistema operativo integrato sul browser Chrome.

Forse non tutti sono a conoscenza, che il progetto Chrome non è altro che una integrazione made in Google, di un progetto open source chiamato Chromium e sostenuto dalla stessa azienda, a cui Google attinge periodicamente, colora l'iconcina, ci aggiunge due o tre moduli proprietari come il visore pdf integrato e un supporto multimediale decente e quindi lo sforna in upgrade come nuova release.

Casualmente questo è più o meno lo stesso modello di sviluppo di Android, cioè un progetto Open Source a cui Google aggiunge le sue applicazioni ma se ne può fare benissimo a meno. La differenza è che per Android le applicazioni di Google sono un must per avere un minimo di servizi, mentre Chromium funziona benissimo anche senza le estensioni di Chrome

Diversamente il progetto Chromium, è un po`difficile da scaricare ed usare, se girate un po` per il sito dopo immani tentativi nel farvi installare Chrome, forse dovreste trovare delle daily-builds, probabilmente dentro uno sgabuzzino col cartello "attenti al leopardo" (cit.).

I ChromeBooks dicevamo, utilizzano Chrome-OS che allo stesso modo è ospitato sul sito di Chromium in versione open source detta "Chromium OS", scaricabile e compilabile dallo stesso sito.

Se volete invece avere le builds di Chromium OS già pronte stanno sul sito di Hexxeh, ovviamente le trovate per chiavetta o macchina virtuale perché installarle è tutta un'altra storia.

Ah ... dimenticavo una ovvietà : Chrome OS è chiaramente Linux, come Android.

Chrome OS e poi ?


La storia diversa è che se avete un NetBook e Chrome OS non avete risolto nulla, perché Chrome OS nasce per essere preinstallato su un ChromeBook e solo in quelle condizioni si aggiorna (che per un browser può anche essere utile)  oltre a tante altre cose.

Queste tante altre cose, ci portano alla conclusione che nel momento in cui possedete un ChromeBook, avete un Linux blindato con una essenziale dipendenza dalla rete e da Google stessa.

Vi loggate nella macchina con il vostro login di Google che diventa il vostro mondo, proprio come un telefono o un Tablet Android e la vostra vita diventa Google, nel senso che se dovete stampare qualcosa o ve lo scaricate su chiavetta e andate su un altro computer oppure stampate cloud e vi portano i fogli di carta a casa.

Questo è l'essenziale motivo per cui, invece di tentare di operare sul progetto di Chromium OS per inserire i drivers di vari hardware ( invece del frame-buffer dei bundles precompilati ), ho optato per riprende un mio vecchio progetto.
 

Chromix 


Dopo aver tanto criticato i NetBook fin dalla loro origine, un giorno uscendo di casa in periodo post iPAD mi capitò di vedere un  Acer  Packard Bell in una vetrina, in svendita per un pugno di dollari e ovviamente lo acquistai.

Dopo avere immediatamente rasato al suolo Windows XP  mi avventurai ad installare l'Ubuntu di allora che era la 10.04 con grande successo, di cui feci pure un video, ricevendo pesanti critiche sui mie gusti musicali autarchici :



Fui molto contento del risultato, come potete vedere dal video, l'ATOM del mio piccolo "gioiello" era usato benissimo.

Ma poi un giorno il Patron Mark, si trasformò da Dr. Jekyll in Mister Hide e il mondo Ubuntu mutò, tant'è che al primo aggiornamento, il mio NetBook tornò prima a XP, a cui seguirono un paio di giorni, tesi a cancellare un paio di centinaia di BloatWares , due o Tre Spywares, un Virus Nativo e il Norton Antivirus disattivato da aggiornare e dopo breve vita al ruolo primevo di inutile soprammobile.

Un giorno però mentre lavoravo su un PC aziendale e avevo bisogno di navigare un po` per gli affari miei (durante le pause ovviamente), misi a punto una cosina con Ubuntu - LXDE e Chromium, una chiavettina USB da inserire nel PC, che partisse direttamente col browser con tanto di Splash Screen e customizations e la chiamai Chromix.

Chromix, giace ancora qui accanto a me e ormai il browser non si aggiorna più, in realtà non si è mai aggiornato, trattandosi appunto di una chiavetta USB ma è il pensiero che conta perché se l'avessi installato nel NetBook oggi non si aggiornerebbe e questo non è bello.
 

Menare il can per l'aia


Ordunque spiegata la storia inesistente di Chromix, oggi ho deciso di ripartire da capo, creando una piccola distribuzione rolling per Netbook che chiamerò Chromix fortemente basata su Chromium ma con la possibilità di lanciare applicazioni native.

Tutto ciò non sarà facile, perché si riparte da Debian in un mondo che non sarà scevro di sorprese e che scopriremo nei prossimi post.


lunedì 4 febbraio 2013

Foto 3D

Scripta Manent III

 

Pinguini per la testa

Proprio oggi, sfruttando un istante di sole invernale, gironzolavo per una montagna dalle mie parti, sforzandomi di dedicare la giornata a pensieri cauti ed evasivi, in cui i pinguini non erano annoverati.

Così come la bettola non è il miglior posto ove l'Alcolista Anonimo possa disintossicarsi, passeggiare tra la neve non è una attività che tende a farti dimenticare i pinguini, specie quando il panorama è molto bello e ti chiedi come portarne un pezzettino a casa (di panorama, non di pinguino).

Ed è lì che ti rendi conto che le foto sono così piatte e poco aiutano a rappresentare quello spettacolo, quindi è inevitabile che una mente ormai deviata inizi a vagare, pensando al fatto che il suo PC ha un monitor 3D, che ha un software per vedere le foto 3D e da lì all'idea, il passo è breve e mentre tutto questo accade, il passo rischia anche di scivolare.

Ma bando alle ciance torniamo sul pezzo e non prima di ossessionarvi con un po` di cultura informatica.

PNM

Perhapsnoteveryoneknowsthat ,  i sistemi come Linux hanno un formato jolly molto particolare chiamato netpbm di cui esistono varie estensioni, uno per formato.

La più simpatica è il portable anymap format che è un formato studiato appositamente per essere semplice e comodo , cioè un formato che non ti obbliga a strane manipolazioni e scorrimenti di bit o formati binari alieni (ogni riferimento alle .bmp è puramente casuale).

Lascio a voi la gioia di capirne la semplicità e la completezza formale.

Ciò che è importante comprendere è che per questa sua questa versatilità di solito non lo si usa per memorizzare le immagini (cosa che poco si adatta ad un formato lossless non compresso) ma per ogni genere di manipolazione, con pipes e programmi vari.

E su Linux c'è tutta una serie di programmini di cui vanno pazzi quelli che scrivono (o scrivevano) le CGI e che in Debian per esempio possiamo trovare nel pacchetto netpbm (i programmini, non quelli che li usano).

 

Scattare foto 3D!

Beh scattare foto 3D non è complicato. Si trova un piano oppure se si va in montagna come me si evita di bere grappa e si prova a mantenere il polso fermo, poi si scatta una foto col cellulare e si fa scorrere orizzontalmente, di 3 o 4 centimetri da destra a sinistra, scattando una seconda fotografia, così  :



Come si può facilmente intuire dal disegno che compongono le due freccette gialle la foto risulterà in questo modo incrociata. I più intuitivi avranno anche capito che se fate il contrario e invertite le foto il risultato sarà lo stesso.

In un modo o nell'altro si otterranno due foto la prima delle quali è il punto di vista dell'occhio destro e la seconda di quello sinistro.

 

Lo scriptino finale

I capitoli della serie Scripta Manent, non sono ovviamente scripts completi ma piuttosto cenni su cosa si può fare con Linux, spesso sono solo righe, giusto per capirci.

Ed è quindi seguendo questo spirito avventuriero che dopo aver scaricato le foto, possiamo applicare questo script che ho chiamato sbs3d :

#!/bin/bash
tmpfile=`mktemp`
jpegtopnm $1 >$tmpfile
jpegtopnm $2 | pnmcat -lr $tmpfile - | pnmtojpeg --quality=85 >$3
rm $tmpfile

Scrivendolo, rendendolo eseguibile (chmod 755), magari copiandolo in /usr/local/bin e quindi invocandolo in questo modo :

sbs3d <first> <second> <output>

che nel mio caso diventa :

sbs3d IMG_20130203_131945.jpg IMG_20130203_131949.jpg lamiafoto3d.jpg


Lo script, crea un file temporaneo, ci salva la prima immagine convertita in pnm, poi con una sola riga di codice e una serie di pipes, passa la seconda immagine, ci fa il cat lr cioè left-right e riconverte in jpg con qualità 85 (che è abbastanza alta), passando infine il risultato nel terzo nome file indicato, poi si cancella il file temporaneo.

Lo Stereogramma

Se siete stati abbastanza bravi da non aver confuso o sovrapposto le foto, e di non aver cancellato importantissimi lavori su cui potrete piangere per i prossimi vent'anni, dovreste trovarvi le stesse foto di prima, più un file chiamato lamiafoto3d.jpg tipo questo :


A questo punto avete creato una SBS-Cross-Eye-3D-Photo e cioè uno stereogramma, così se incrociate gli occhi fissandolo dovreste vedere apparire al centro la foto 3D.

Con gli occhi dritti

Il formato SBS spesso ridotto ad HSBS (cosa che si ottiene scalando orizzontalmente la foto al 50%), è un formato molto noto e usato spesso anche per i film 3D.

Se ne deduce che se volete vedere la foto con gli occhi dritti, dovete procurarvi un monitor 3D con relativo software.

Se proprio non volete, potete cercare da qualche parte se avete in giro un paio di occhiali anaglifici e provare con le diverse centinaia di programmi che li gestiscono anche sui monitor normali, compresa la versione ora GIT di VLC.

Ossequi.