martedì 21 aprile 2020

DNS dinamico con dynu e ddclient


Facendo seguito al post di qualche anno fa, nel frattempo sono cambiate un po' di situazioni, la più grande è che ho cambiato ISP e adesso ho Fastweb, che fornisce su richiesta (già effettuata) un indirizzo IP pubblico; l'altra situazione nuova è che sto usando DietPi e mi piace tantissimo: già il fatto che lanciando il comando htop si riescono a vedere tutti i processi in una sola schermata:
mostra come l'autore di questa distribuzione stia attento ad attivare solo i servizi essenziali.

Avere un indirizzo IP pubblico statico in realtà rende poco utile l'uso di un DNS dinamico, ma già che c'ero l'ho impostato, con dynu (che tra i vari servizi gratuiti provati mi sembra quello più stabile e semplice) e con ddclient, di cui riporto, la procedura di configurazione.

Per prima cosa si lancia il comando per vedere se ddclient riesce a recuperare l'indirizzo IP pubblico:
ddclient -query
Il cui output è:
Can't exec "ifconfig": File o directory non esistente at /usr/sbin/ddclient line 1426.
use=web, web=dnspark address is NOT FOUND
use=web, web=dyndns address is myip
use=web, web=loopia address is myip
Poi bisogna recuperare una riga che riporta l'indirizzo IP (io ho scelto quella di dyndns) ed inserirla nel file di configurazione /etc/ddclient.conf:
protocol=dyndns2
use=web, web=dyndns
server=api.dynu.com
login=myloginpassword='mypass'
myhost.dynu.net

Per vedere se la configurazione è valida si lancia il seguente comando di test:
ddclient -debug -verbose -noquiet
e si verifica se è tutto ok.

mercoledì 28 febbraio 2018

Cosa fare se linux non riconosce la risoluzione del monitor

https://www.rte.ie/sport/gaa/2018/0227/943896-cold-snap-could-have-most-impact-on-hurling-league/

Se il vostro linux si ostina a farvi vedere solo le risoluzioni di default 640×480, 800×600 o 1024×768 ci viene in aiuto l'ottimo randr, come illustrato qui.

Riporto qualche info dal link in caso muoia nel tempo:
  • l'output del comando xrandr ci dice che uscita video stiamo usando tra DisplayPort-0, HDMI-0 o DVI-0;
  • il comando cvt genera i parametri della risoluzione che vogliamo;
  • con tre comandi xrandr con parametri newmode, addmode e out si attiva la nuova risoluzione.
Ecco i comandi per il full HD (1920×1080) con evidenza dei valori generati dal comando cvt che variano da monitor a monitor:
  1.  cvt 1920 1080
  2.  xrandr --newmode "1920x1080_60.00"  173.00  1920 2048 2248 2576  1080 1083 1088 1120 -hsync +vsync
  3.  xrandr --addmode DVI-0 1920x1080_60.00
  4.  xrandr --output DVI-0 --mode 1920x1080_60.00
Settaggi per il mio particolare monitor-TV:
xrandr --newmode "1936x1080_60.00"  174.00  1936 2064 2264 2592  1080 1083 1093 1120 -hsync +vsync

Correzione luminosità

In caso si voglia avere un desktop più o meno luminoso, si può usare il comando
xrandr --output DVI-0 --gamma 1.5:1.5:1.5
oppure
xrandr --output DVI-0 --brightness 1

Configurazione persistente

Salvare la sequenza dei comandi xrandr nel file .xprofile

domenica 26 novembre 2017

Midi sotto linux


Verificare con il comando:
aconnect -o
di avere in elenco solo "Midi through port": è la modalità di default che invia i comandi midi ad un dispositivo esterno (che ovviamente non abbiamo).

Abbiamo bisogno di un sintetizzatore software come Timidity o FluidSynth, con i loro campioni digitalizzati.

Ho installato quest ultimo con il comando:
 apt-get install fluidsynth fluid-soundfont-gm
ho scaricato un midi di prova da qui.

Ho verificato l'installazione con il comando
fluidsynth --audio-driver=alsa -o audio.alsa.device=hw:0 /usr/share/sounds/sf2/FluidR3_GM.sf2 test1.mid
Se si lancia il sintetizzatore software così:
fluidsynth -l -s -i -aalsa -o audio.alsa.device=default /usr/share/sounds/sf2/FluidR3_GM.sf2
poi il comando iniziale di aconnect mostra anche il driver fluid synth.

Tutto è partito dall'installazione di un videogioco sotto wine che non mi riconosceva il dispositivo midi...

Riferimenti qui e qui.

venerdì 14 aprile 2017

Test HTML5 canvas

Qua sopra c'è un canvas interattivo.

giovedì 5 gennaio 2017

Problemi Bluetooth con Qualcomm Atheros QCA9565 / AR9565 Wireless Network Adapter


Qualcosa che non va in questo portatile con linux l'ho trovato anche io: il bluetooth integrato.

Si tratta di un dispositivo dual wireless, che fornisce connettività sia Wifi che Bluetooth. La parte Wifi funziona senza problemi, mentre nel tentativo di connettere un mouse ho scoperto che la parte che si occupa del bluetooth non rileva assolutamente nulla; ho provato anche a far rilevare il cellulare android ma senza successo.

Ho attaccato un dongle Bluetooth qualsiasi ed ha funzionato senza problemi, quindi deduco che è il driver del dispositivo che non è completamente compatibile.

Il comando inxi -N fornisce informazioni riguardo alle schede di rete:
Network:   Card-1: Realtek RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller
           driver: r8169
           Card-2: Qualcomm Atheros QCA9565 / AR9565 Wireless Network Adapter
           driver: ath9k

e risulta che il driver usato è l'ath9k.

Con il comando lsusb -v esce fuori che il dispositivo ha l'ID
Bus 001 Device 004: ID 04ca:3018 Lite-On Technology Corp.

Cercando il codice 04ca:3018 su google in due giorni diversi, sono usciti risultati diversi, poiche nel frattempo qualcuno ha postato una domanda su askubuntu riguardo allo stesso chip, ed un bug report su launchpad, che è stato sistemato nel giro di poche ore! Molto simile a quello che era successo per il touchpad, ad indicare che l'hardware del mio portatile è sufficientemente nuovo da non aver ancora tutti i dispositivi funzionanti OotB.

La patch riportata sul bug report ha risolto il mio problema, anche se un paio di cuffie bluetooth che ho da poco acquistato non funzionano ancora bene per un problema con bluez e pulseaudio che devo ancora risolvere.


Sistemare la posizione della cartella Desktop/Scrivania


Ho notato che ad un certo punto nella mia home dir erano presenti due cartelle, una chiamata Desktop ed una chiamata Scrivania:


Evidentemente qualche programma ha reimpostato la cartella DESKTOP andando in conflitto con la configurazione locale, per cui si è creata questa situazione.

La posizione della cartella Desktop è definita da una specifica chiamata XDG che definisce una serie di percorsi standard all'interno della home dir di ciascun utente. Un buon articolo della documentazione di ArchLinux descrive brevemente di cosa si tratta.

Sono andato a vedere quindi il contenuto del file ~/.config/user-dirs.dirs ed effettivamente la variabile XDG_DESKTOP_DIR puntava a "$HOME/Desktop" piuttosto che a "$HOME/Scrivania"; ho ripristinato la stringa, ed effettivamente rilanciando il gestore file Nemo, l'icona Desktop adesso è rappresentata come una cartella normale:


Per curiosità sono andato a vedere a cosa puntano le altre cartelle, ed ho notato  XDG_TEMPLATES_DIR: c'è un ottima spiegazione del suo uso su askubuntu.

In base a quanto lì descritto, ho creato due file con un nome significativo, con dentro magari del contenuto di partenza, per cui cliccando con il tasto destro in nemo e selezionando la voce Crea Nuovo Documento, escono proprio i nomi che abbiamo inserito poc'anzi:


Il comando per capire dove punta una delle cartelle definite è il seguente:
xdg-user-dir TEMPLATES
Ne approfitto per inserire tutte le cartelle all'interno della cartella Documenti, in modo da avere una cartella home più snella, per cui il file ~/.config/user-dirs.dirs finale è il seguente:
# This file is written by xdg-user-dirs-update
# If you want to change or add directories, just edit the line you're
# interested in. All local changes will be retained on the next run
# Format is XDG_xxx_DIR="$HOME/yyy", where yyy is a shell-escaped
# homedir-relative path, or XDG_xxx_DIR="/yyy", where /yyy is an
# absolute path. No other format is supported.
#
XDG_DESKTOP_DIR="$HOME/Scrivania"
XDG_DOCUMENTS_DIR="$HOME/Documenti"
XDG_DOWNLOAD_DIR="$HOME/Documenti/Scaricati"
XDG_TEMPLATES_DIR="$HOME/Documenti/Modelli"
XDG_PUBLICSHARE_DIR="$HOME/Documenti/Pubblici"
XDG_MUSIC_DIR="$HOME/Documenti/Musica"
XDG_PICTURES_DIR="$HOME/Documenti/Immagini"
XDG_VIDEOS_DIR="$HOME/Documenti/Video"

lunedì 2 gennaio 2017

Primi esperimenti di desklet in Cinnamon


Dopo qualche settimana di smanettamenti (e smadonnamenti!) vari sono riuscito ad ottenere qualche prototipo funzionante di desklet per cinnamon.

La prima cosa che mi viene da dire è che è veramente difficile riuscire a raccapezzarsi tra tutte le librerie usabili, quali sono le funzioni e come si usano!

Questo perchè il linguaggio usato per l'implementazione dei desklet è il JavaScript, mentre la documentazione delle librerie richiamabili è generata dal codice C, con la possibilità di essere richiamate da codice python o altri linguaggi. Come si immagina la situazione è veramente complessa.

La storia è che sono state inventate delle interfacce per chiamare queste librerie scritte in C dal JavaScript (o da altri linguaggi), raccolte sotto il nome di GObject Introspection.

La documentazione di queste librerie segue lo standard C, per cui ad esempio la funzione
ClutterActor *gtk_clutter_embed_get_stage (GtkClutterEmbed *embed);
va invocata in JavaScript come
const GtkClutter = imports.gi.GtkClutter;
this._clutterEmbed = new GtkClutter.Embed();
this._gtkEmbedActor = this._clutterEmbed.get_stage();
per cui la prima parte del nome della funzione gtk_clutter rappresenta la libreria da importare: GtkClutter; mentre l'oggetto GtkClutterEmbed diventa GtkClutter.Embed; e l'ultima parte del nome della funzione rappresenta come va chiamata la funzione (get_stage); tra l'altro in C non ci sono gli oggetti mentre in JavaScript la funzione viene invocata sull'istanza (this._clutterEmbed).


Documentazione


Un ottimo post che spiega una desklet di tipo hello world è disponibile qui.

Una fonte preziosa di informazioni è quella ufficiale di linuxmint (i creatori di Cinnamon).
 
Un'altra ottima fonte di informazioni è il pacchetto devhelp, che contiene offline un sacco di reference utili; si installa con il comando
 sudo apt install devhelp cinnamon-doc

 

Un esempio


Andando al sodo, ecco un codice di esempio che stampa un'immagine:

il file comune metadata.json:
{
 "uuid": "videoDesk@zac",
 "name": "Video Desklet",
 "description": "Show video streams on your desktop",
 "icon": "",
 "prevent-decorations": false,
 "max-instances": "100",
 "dangerous": false
}

il file desklet.js:
const Desklet = imports.ui.desklet;
const St = imports.gi.St;
const Clutter = imports.gi.Clutter;

function VideoDesk(metadata, desklet_id)
{
 this._init(metadata, desklet_id);
}

VideoDesk.prototype =
{
 __proto__: Desklet.Desklet.prototype,

 _init: function(metadata, desklet_id)
 {
  Desklet.Desklet.prototype._init.call(this, metadata, desklet_id);

  this.window = new St.Bin();

  let imgFilename = '/home/zac/Progetti/videoDesk/image.png';
  this._clutterTexture = new Clutter.Texture({keep_aspect_ratio: true});
  this._clutterTexture.set_from_file(imgFilename)

  this._clutterBox = new Clutter.Box();
  this._binLayout = new Clutter.BinLayout();
  this._clutterBox.set_layout_manager(this._binLayout);
  this._clutterBox.set_width(this.metadata["width"]);
  this._clutterBox.add_actor(this._clutterTexture);
  this.window.add_actor(this._clutterBox);

  this.setContent(this.window);
 }
}

function main(metadata, desklet_id)
{
 return new VideoDesk(metadata, desklet_id);
}



Un trucco pratico


Durante l'implementaizone lancio spesso il desklet per verificare che la sintassi dei comandi che sto scrivendo sia corretta. Un'opzione è quella di aggiungere e rimuovere in continuazione il nostro desklet dal desktop. Ma ho trovato molto più comodo e veloce usare il compilatore di JavaScript di Cinnamon (il cjs). Tra l'altro ho impostato l'editor Scite a lanciarlo ogni volta che premo F5 per cui l'esecuzione e visualizzazione degli errori è ancora più veloce.

In scite la configurazione per la compilazione automatica si ottiene aggiungendo al file di configurazione la linea
command.go.*.js=cjs $(FileNameExt)
il codice del file di test (che mostra un filmato):

#!/usr/bin/cjs

const Lang = imports.lang;
const Gtk = imports.gi.Gtk;
const Gst = imports.gi.Gst;
const Clutter = imports.gi.Clutter;
const ClutterGst = imports.gi.ClutterGst;
const GtkClutter = imports.gi.GtkClutter;

ClutterGst.init(null, null);

const Application = new Lang.Class({
 //A Class requires an explicit Name parameter. This is the Class Name.
 Name: 'Application',

 //create the application
 _init: function() {
  this.application = new Gtk.Application();

   //connect to 'activate' and 'startup' signals to handlers.
   this.application.connect('activate', Lang.bind(this, this._onActivate));
   this.application.connect('startup', Lang.bind(this, this._onStartup));
 },

 //create the UI
 _buildUI: function() {
  this._window = new Gtk.ApplicationWindow({ application: this.application, title: "Hello World!" });
  this._window.set_default_size(200, 200);
  this.label = new Gtk.Label({ label: "Hello World" });

  this.player = new ClutterGst.Playback();
  this.player.set_filename("/home/zac/Scrivania/test.mov");

  this._content = new ClutterGst.Aspectratio();
  this._content.set_player(this.player);

  this._clutterBox = new Clutter.Box();
  this._binLayout = new Clutter.BinLayout();
  this._clutterBox.set_layout_manager(this._binLayout);
  this._clutterBox.set_width(300);
  this._clutterBox.set_height(100);
  this._clutterBox.set_content(this._content);

  this._clutterEmbed = new GtkClutter.Embed();
  this._gtkEmbedActor = this._clutterEmbed.get_stage();
  this._gtkEmbedActor.add_actor(this._clutterBox);

  this._window.add(this._clutterEmbed);

  this.player.set_playing(true);
 },

 //handler for 'activate' signal
 _onActivate: function() {
  //show the window and all child widgetsq
  this._window.show_all();
 },

 //handler for 'startup' signal
 _onStartup: function() {
  this._buildUI();
 },

});

//run the application
let app = new Application();
app.application.run(ARGV);

Il prossimo passo è aprire un repository su GitHub dove piazzare il codice dei miei esperimenti, nel frattempo, buona programmazione!

giovedì 29 dicembre 2016

KDE Fail


Purtroppo dopo qualche giorno di KDE ho dovuto come al solito tornare verso lidi più sicuri e meno avventurosi (leggi: meno bacati), per cui sono tornato su Mint Cinnamon edition, meno estremo in termini di feature ma sicuramente più stabile.

Non ho capito perchè gli sviluppatori di KDE tendono ad essere entusiasti nell'inserire nuove funzionalità e paradigmi di usabilità, dolphin, plasma, e il concetto di attività in primis, ma sottovalutano la parte relativa alla risoluzione dei problemi e bug che sorgono durante l'implementazione, per cui alla fine un sistema per quanto gradevole da usare viene abbandonato per gravi problemi di usabilità.

Nel mio caso ad esempio, il touchpad ha funzionato solo per qualche riavvio dopo aver applicato la patch che indicavo nel post precedente per poi ritornare inusabile, ogni tanto lo schermo diventava nero, blocchi casuali del desktop.

In quest'ottica ho dovuto ripiegare su Cinnamon (un fork di Gnome 3) comunque ricco di feature ma stabile a sufficienza per i miei gusti. In alternativa potevo installare Mate (fork di Gnome 2) meno ricco di feature ma più adatto a hardware vecchio rispetto a Cinnamon (non il mio caso).

In ogni caso, ho anche iniziato a vedere qualcosa relativa alla programmazione dei desklet, vediamo nei prossimi post se ho combinato qualcosa!

lunedì 28 novembre 2016

Linux su Asus VivoBook F556UV



Erano diversi anni che avevo voglia di usare KDE come desktop di tutti i giorni, ma ogni volta mi sono scontrato con bug e problemi di usabilità che mi hanno impedito nell'intento. Con l'acquisto del nuovo portatile ho colto l'occasione di riprovare per l'ennesima volta kde, e mi appunto qui le varie avventure per tenere traccia delle configurazioni effettuate.

Sul sito ufficiale di kde c'è un elenco (parziale) di distribuzioni con kde, e il mio primo tentativo è stato con KDE Neon, distribuzione ufficiale degli sviluppatori che contiene l'ultimissima versione del desktop environment.

La distribuzione ha una grafica ottima ma l'avvio è risultato un po' lentino (20 secondi circa) e, pecca più grande, non supporta la scheda grafica Nvidia montata sul mio laptop: KDE Neon fa uso di Wayland come gestore della grafica, che allo stato attuale non gestisce bene le schede video Nvidia. In compenso la scheda video intel integrata funzionava molto bene.

La seconda distribuzione è stata mint versione kde. Come al solito mint è garanzia di pulizia e funzionalità essenziali, per cui mi sono trovato subito molto bene. Un grosso bug che mi ha dato molto fastidio (probabilmente presente anche su Neon, ma non ci ho fatto caso poichè preso dai tentativi di far funzionare l'NVidia) è quello del mancato supporto al touchpad: viene rilevato come un mouse, per cui le gesture come lo scroll orizzontale e verticale non funzionano, così come la supeficie dei pulsanti risulta attiva anche come movimento, per cui spesso il click del mouse sposta il cursore facendoti cliccare su oggetti non voluti, veramente fastidioso. Tra l'altro il menù di configurazione del touchpad risulta ingrigito con la frase "No touchpad found".

Per questo motivo ho optato per un'altra distribuzione, OpenSuse, che non ho mai visto in azione, per cui un po' per la curiosità di vedere come funziona, e nella speranza che lì il touchpad funzioni come si deve ho provato ad installarla. Mi sono miseramente bloccato al passaggio relativo alla partizione, l'ho trovato piuttosto oscuro e macchinoso per cui ho deciso di tentare ancora con mint.

Dopo un paio di serate di ricerca, ho trovato la soluzione!
Un genio ha messo a disposizione su github il driver per il mio touchpad, è bastato lanciare il comando indicato nel readme et...voilà: ha cominciato a funzionare tutto alla perfezione! Anche il menù di configurazione del touchpad ha tutte le voci operative! Mio salvatore!

Per cui le mie avventure con mint kde edition non sono finite!

Il portatile perfetto


Era da diverso tempo che volevo acquistare un nuovo portatile che sostituisse il mitico Dell Inspiron 6400, di cui parlavo nel primissimo post di questo stupendo blog ben nove anni e mezzo fa.

Dopo diverse settimane (mesi!) di analisi di che cosa offtre il mercato, sono giunto alla conclusione che volevo un portatile 15" con processore i7 e con hard disk SSD. Questo perchè lo schermo deve essere ben leggibile, i7 è la famiglia intel di processori più potente per il mercato consumer, e SSD perchè è una tecnologia che surclassa almeno di un fattore 5 la velocità di un disco rigido tradizionale.

Una configurazione di questo tipo non è facile da trovare, perchè tutti gli i7 che si vedono in giro hanno hard disk da terabyte, mentre i portatili con ssd sono tipicamente degli ultrabook (tipo chromebook) con una potenza (e costo) inferiore a fronte di una mobilità (in termini di durata della batteria e dimensione dello schermo contenuta) migliorata.

C'è un simpatico sito che permette di scegliere le caratteristiche preferite, ed il sistema ti fornisce una serie di laptop che le soddisfano. Il problema è che tutti i laptop elencati sono disponibili su amazon US e non sul sito italiano, per cui serve solo ad avere un'idea sul modello che vogliamo acquistare.

Dopo aver studiato le varie caratteristiche, conviene andare sui siti più famosi di e-shop tipo amazon, eprice, pixmania, ma anche quelli delle catene di elettronica tipo unieuro, euronics, expert per vedere cosa effettivamente è disponibile sul mercato italiano.

Alla fine ho acquistato da unieuro un portatile che è una bomba, per soli 800€ (non so perchè ma adesso sta a 899€(?)) con le seguenti caratteristiche:

Modello: Asus VivoBook F556UV
Monitor: 15.6"
CPU: i7-6500U
RAM: 12GB
SSD: 512GB
GPU esterna: NVIDIA GeForce GT 920MX

Le prime impressioni sono molto positive: linea elegante, design leggero e corpo compatto (il vecchio Dell è un po' un mattoncino).

Effettivamente la risoluzione 1920✕1080 rende la dimensione del monitor fin troppo grande (tutti i font sono piuttosto piccoli e dettagliati). Ho scoperto a posteriori che questa caratteristica per i monitor si chiama High DPI, per cui testo e icone appaiono molto piccoli se non gestito dal sistema operativo).

Ma qui veniamo alla vera chicca: i tempi di avvio sono eccezionali: sia sotto Windows 10 che sotto Linux Mint KDE siamo intorno ai 12 secondi dal menù di grub al desktop.