dimecres, 20 de març del 2013

Terminals “Kiosk” amb Xubuntu

Per necessitats de la feina m'he decidit a actualitzar un vell sistema a mode “Kiosk” per a un equipament social. Aquí faig cinc cèntims a mode de recordatori per a mi mateix i, evidentment, esperant que a algú li pugui ser útil.
Bé, anem pam a pam amb que s'ha fet i per què
Instalació de GNU/Linux
Per a aquest projecte he escollit Xubuntu 12.10 per la seva potència, versatilitat i lleugeresa. Evidentment podeu fer servir qualsevol Linux i instal·lar-hi el entorn de finestres Xfce4, que és molt lleuger i bonic.
No explicarem aquí cóm instal·lar una distribucoó de Linux, però si no en sabeu podeu accedir a: https://help.ubuntu.com/12.10/ubuntu-help/index.html
També podeu veure cóm “tunejar” l'aspecte i components d'aquest lleuger escrtitori a: http://www.linuxnoveles.com/2012/xubuntu-12-10-ubuntu-xfce-configurar-despues-de-instalar/

Actualització d'Xubuntu
Un cop ja instal·lat Xubuntu cal fer algunes cosetes per que tot rutlli millor;
1.- Deshabilitar l'usuari “Invitado” (Guest user). A les darreres versions d'Unbuntu i les seves variants trobareu que existeix aquest usuari especial que, per al nostre cas, no interessa de mantenir. La idea d'aquest és bona, tenir un usuari molt limitat per quan ve algú al nostre ordinador i no volem que pugui toquerejar absolutament res de res. Amés un cop acabada la sessió, s'esborra tot el que hagi deixat :)
Per deshabilitar aquest usuari cal editar el fitxer /etc/lightdm/lightdm.conf i afeguir una línea amb allow-guest=false:
$ sudo vim /etc/lightdm/lightdm.conf
El fitxer quedarà similar a això:
[SeatDefaults]
user-session=ubuntu
greeter-session=unity-greeter
allow-guest=false

2.- Afegitons per a Xubuntu
Per gaudir d'algun programari propietari que molts usuaris necessiten:
  • Adobe Flash Plugin
  • GStreamer ffmpeg video plugin
  • Fluendo mp3 decoder
  • unarchiver for .rar files

Així que només cal anar al Terminal i:
$ sudo apt-get install ubuntu-restricted-extras

Per a la correcte reproducció de DVDs:
$ sudo apt-get install libdvdread4
 $ sudo /usr/share/doc/libdvdread4/install-css.sh

Recorda també de tenir sempre ben actualitzat el sistema
$ sudo apt-get update
$ sudo apt-get dist-upgrade

3.- Creació d'scripts per controlar la sessió d'usuari
Estic segur que existiràn millors formes de fer que l'usuari, un cop entri a la sessió, tingui un temps limintat (per aquest cas 60 minuts) i que amés se l'avisi amb un rellotge del temps que li resta.
Bé, el que jo he fet:
Creem l'script per fer un “log out” de la sessió cada 60 minuts. Bé, realment el que fa és cridar a 3 scripts a l'inici de sessió i aquestos inicien la sortida de sessió als 60 minuts i mostra una finestra emergent d'avis d'inici i, quan falten 5 minuts per tancar-se la sessió, un darrer recordatori.
3.1.- Creem l'script d'”autoapagat”. Aquest senzillament força la sortida de la sessió actual.
$ sudo vim /usr/bin/autoapagat
I copiem i engantxem aquestes líneas:
#!/bin/bash
echo 'xfce4-session-logout --logout' | at now

Posem permisos d'execució:
$ sudo chmod a+x/usr/bin/autoapagat

3.2.- Creem l'script d'avis inicial:
$ sudo vim /usr/bin/avis-inici.sh
I copiem i engantxem aquestes líneas:
#!/bin/bash
notify-send 'Teniu 60 minuts de sessió, controleu el rellotge de la part superior dreta per veure el temps restant' 'Alerta inici de sessió' --icon=dialog-information

Li posem permisos d'execució:
$ sudo chmod a+x /usr/bin/avis-inici.sh

3.3.- Creem l'script de darrer avis. Aquest mostra una finestra emergent als 55 minuts de l'inici de sessió (o quan falten 5 minuts per que aquesta es tenqui ;))
$ sudo vim /usr/bin/avis-final.sh
I copiem i engantxem aquestes líneas:
#!/bin/bash
notify-send 'Queden 5 minuts per que es tanqui la sessió!!' 'darrer avis' --icon=dialog-information

Li posem permisos d'execució:
$ sudo chmod a+x /usr/bin/avis-final.sh

3.4.- Finalment creem l'script que crida els tres anteriors:
$ sudo vim /etc/init.d/autoapagat

I copiem i engantxem aquestes líneas:
#!/bin/bash

### BEGIN INIT INFO
# Provides: autoapagat
# Required-Start: $remote_fs $syslog
# Required-Stop: $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Start daemon at boot time
# Description: Enable service provided by daemon.
### END INIT INFO

at -f /usr/bin/autoapagat now +60 minutes
at -f /usr/bin/avis-inici.sh now +1 minutes
at -f /usr/bin/avis-final.sh now +55 minutes

3.5.- posem permisos d'execució a l'escript:

$sudo chmod a+x /etc/init.d/autoapagat

3.6. - Afegim l'script a l'arrancada init.d:

$  sudo update-rc.d autoapagat defaults

3.7.- Verifiqueu que no demani confirmació en tancar la sessió. Per defecte Xfce4 te marcada la opció “Pregunta al sortir” a les preferències generals de “Sessió i engegada”. Cal desmarcar aquesta opció per que pugui fer el “Log out” bé.


"Chapucilla"!
Inicialment aquest conjunt d'scripts els tenia pensats per un entorn d'escriptori Gnome, però degut a l'escassa potència dels ordinadors on s'ha de muntar tot plegat finalment vaig decantar-me per Xfce4. El problema, sembla ser, que no acaba de rutllar l'script a l'init.d ;(
A grans mals grans sol·lucions. Així que per el moment cridarem l'script des de la opció d'autoarrancada de les preferències de Xfce4


Creació d'usuari “Luser” i restringuir el que hi pot fer
Cal primerament crear un usuari "tonto", per això anirem a panell de preferències, usuaris, i allà especificarem que volem crear un nou usiari, li asignarem un nom (a mi m'encanta "luser") un password i llestos.
Ara caldrà, entrant al sistema amb aquest usuari, deshabilitar algunes cosetes:
1.- Instalem i afegim el rellotge de "compte enrera" per que l'usuari vegui el tems restant que li queda en la sessió actual.
$ sudo apt-get install Xfce4-goodies Xfce4-time-Out-pugin
Aleshores anem a editar el Panell superior i li afegim

2.- Editarem el menú per deshabilitat totes aquelles opcions que NO han de tocar per res, sobretot temes de sistema ;)
3.- Deshabilitarem que puguin entrar al menú d'aplicacions amb el botó secundari del retolí

4.- Farem desaparèixer també les icones de l'escriptori que no interesa que puguin accedir-hi

5.- També ens assegurarem que les opcions de tancar sessió no preguntin a l'usuari i que no recordi la darrera sessió.

6.- Carregarem l'script "Kiosk" a l'inici de sessió també a aquest usuari.

7.- Recomano que també personalitzeu les preferències del firefox per tal de que no desi l'historial, ni els passwords. Amés podeu especificar un web d'inici per defecte i fer desaparèixer el menú d'edició per que no hi merdegin.

Afegitons de darrera hora
Recomano també instal·lar LibreOffice.org per als usuaris:
$ sudo apt-get install libreoffice-base

Si teniu cap suggeriment, millora o comentari podeu fer-ho des d'aquest blog.

Posant ombra amb CSS

Les funcionalitats de CSS3 cada dia sorprenen més i.. funcionen!
http://css.flepstudio.org/en/css3/box-shadow.html

Theme override for Upload. module’s attachments list

Interesant post per tunejar els fitxers adjunts a Drupal. Ho hauré de posar en pràctica aviat per un web que estic desenvolupant, ja explicaré com va la experiència.

http://www.island94.org/2008/08/drupal-theme-override-for-upload-modules-attachments-list/

També tenim el mòdul itweak_upload que fa tot això per nosaltres ;) http://drupal.org/project/itweak_upload

Theming i moure elements del peu dels nodes; o cóm crear i modificar variables de funcions

En la meva lluitant per canviar l'aparença de les icones del mòdul Addthis m'he topat amb un interesant artícle que fa una explicació clara i senzilla per extreure la informació d'Addthis del peu del node a un altre zona. Així de pas controleu un xic les funcions de drupal i crear variables ;)

http://www.webenstock.com/es/blog/2011-07-23-theming-mover-enlaces-addthis-arriba-nodo-en-drupal-6x

I un xic el mateix però en anglès, http://snorkers.blogspot.com/2010/05/theming-drupal-node-links.html

Forward field a views

Bé, hi ha un modulet a Drupal que permet presentar als nodes un enllaç per que els usuaris puguin enviar un node per correu electrònic i així compartir la informació amb els seus coneguts.

El modulet esta prou bé però la integració amb Views (per a mi) deixa un xix a desitjar.

La cosa és que a un web tenia la necessitat de mostrar el botonet d'aquest mòdul com un camp CCK per que a la vista d'un tipus de contingut es pugui enviar directament per correu.

Clar que molts pensareu, com jo, que aquest tipus de "features" com les de postejar un node a Twitter o fer un "like" de facebook per lògica haurien d'estar només a la vista complerta d'un node. No te sentit que enviïs o comparteixis una informació que no has llegit, però bé, qui paga mana i si mana això donc ho faig ;)

Així que no tenia idea cóm poder-ho fer i la comunitat de Drupal.com m'ha tornat a sorprendre per la rapidesa i efectivitat de la resposta.

En resum es pot fer de dues formes i les teniu ben documentades aquí: http://drupal.org/node/1478638#comment-5724606 però la que necessitava ve a ser:

  1. A nostre Views creem un nou camp a mostrar del tipus Node ID.
  2. Aquest el configurem per tal de que reescrigui la sortida amb Rewrite i li especifiquem:

<a href="forward?path=node/[nid]">Enviar pàgina per correu electrònic</p>

o més mono

<div id="send-by-mail">

<a class="forward-page" title="Forward this page to a friend" href="forward?path=node/[nid]">
<img class="forward-icon forward-icon-margin" title="
Enviar per correu electrònic" alt="Enviar per correu electrònic" src="http://triviumgc.com/dev/sites/all/modules/forward/forward.gif" typeof="foaf:Image">Enviar per correu electrònic</a>

</div>

 

llistar termes d'una taxonomia amb la funció taxonomy_node_get_terms

<?php
if (arg(0) == 'node' && is_numeric(arg(1)) && !arg(2)) {
  $node = node_load(arg(1));
  foreach ($node->taxonomy as $vid => $term) {
  $vn = taxonomy_vocabulary_load($term->vid);
  $t[$vn->name][$term->tid]['name'] = $term->name;
}
  $output = '';
  foreach ($t as $key => $value){
  $output .= '<fieldset class="fieldgroup collapsible"><legend>'.$key.'</legend>';
  foreach($value as $b => $a){
  $output .= '<div class="field-item odd">';
  $output .= l($a['name'], 'taxonomy/term/' . $b) . ' ';
  $output .= '</div>';
}
  $output .= '</fieldset>';
}
  print $output;
}
?>


La ide que tenia era aprofitar aquesta funció per fer que Drupal cridés a una icona segóns la taxonomia.
Així que amb l'ajud del bon amic Carlos d'Interdixit hem aconseguit l'objectiu:


<img src="/dev/sites/all/themes/omega/css/img/premsa_ikon<?php
if (arg(0) == 'node' && is_numeric(arg(1)) && !arg(2)) {
  $node = node_load(arg(1));
  foreach ($node->taxonomy as $vid => $term) {
  $vn = taxonomy_vocabulary_load($term->vid);
  $t[$vn->name][$term->tid]['name'] = $term->name;
}
$output = '';
  foreach ($t as $key => $value){
  foreach($value as $b => $a){
  $output .= $a['name'];
}
}  print $output;
}
?>.png">


Font: http://api.drupal.org/api/drupal/modules--taxonomy--taxonomy.module/function/taxonomy_node_get_terms/6

Addthis custom button

La única referència que trobo del mòdul AddThis en quan a la personalització del botó Twitter i qualsevol altre és:

 CUSTOMIZATION

You have a number of options available at Administer / Site configuration / Addthis under Button image settings
and Widget settings. Image settings control the button image and widget controls the drop down and window that is opened when user clicks on a link sharing service. More information on how to customize your AddThis button can be found at http://addthis.com/help/customize/custom-button/
If configuration options are not flexible enough for you it is also possible to override theme_addthis_button in your own theme.

Quin merder!
Al final m'ho estic muntant solet a mà, llegint l'api de Twiter i així podem obtenir un codi semblant a:

<code>

<!-- Addthis theming -->
<div id="a9b-tweet-button">

<style type="text/css" media="screen">
  #custom-tweet-button a {
    display: block;
    padding: 2px 5px 2px 20px;
    background: url('http://a4.twimg.com/images/favicon.ico') 1px center no-repeat;
    border: 1px solid #ccc;
  }
</style>

<div id="a9b-tweet-button">
  <a class="a9b-tweet-button" href="https://twitter.com/share?url=http://www.eldominidelweb.cat/<?php print $node_url ?>" target="_blank"><img src="/dev/sites/all/themes/omega/css/img/ik_tweetthis_2.png" title="Twitter"></a>
</div>

</div>
<!-- //Addthis theming -->

</code>
Ara a per el de FB ;(