L'ereditarietà in Python è leggermente diversa rispetto ad altri linguaggi.

Non si usano parole chiave tipo extends, ma si imposta come se fosse un parametro di una funzione.

Supponiamo di avere la generica classe Persona:

class Persona:
    nome = ''
    cognome = ''

    def __init__(self, nome, cognome):
        self.nome = nome
        self.cognome = cognome

    def getNome(self):
        print(self.nome)

    def getCognome(self):
        print(self.cognome)

Per gestire la timezone (TZ) in Linux, possiamo usare un comando disponibile con systemd: timedatectl!

Per i sistemi che non usano systemd, bisognerà procedere alla vecchia maniera.

Ho scoperto che nelle applicazioni web è possibile utilizzare un file manifest, che da determinate informazioni quando si "installano" nelle homescreen dei dispositivi mobili.

E' una tecnologia non ancora stabile e pienamente suppoortata, ma sarebbe già il caso di aggiungerla ai nostri siti.

Da non confondere con Apache Spark, Spark è un frameowrk per applicazioni web per Java.

L'ho trovato, almeno inizialmente, abbastanza semplice da usare, e anche abbastanza familiare se avete già usato Node.js ed Express.

Inoltre, di default, utilizza una versione embedded di Jetty, e quindi non ci sono server da configurare (ma potete comunque usarne un altro se volete).

Iniziamo a vedere qualcosa; useremo Maven, e va bene qualsiasi IDE (io uso Netbeans).

Le applicazioni create con Electron, arrivano già con un menu "pre-confezionato".

Ovviamente è possibile crearne uno personalizzato.

Vediamo come crearne uno (se volete avere una base su Electron, leggete questo articolo):

const {app, BrowserWindow, Menu, dialog} = require('electron');
const path = require('path');
const url = require('url');
let win;

const template = [
    {
        label: 'File',
        submenu: [
            {
                label: 'Apri',
                click() {
                    dialog.showOpenDialog({properties:
                                [
                                    'openFile',
                                    'openDirectory',
                                    'multiSelections'
                                ]}
                    )
                }
            }
        ]
    },
    {
        label: 'Edit',
        submenu: [
            {role: 'undo'},
            {role: 'redo'},
            {type: 'separator'},
            {role: 'cut'},
            {role: 'copy'},
            {role: 'paste'},
            {role: 'pasteandmatchstyle'},
            {role: 'delete'},
            {role: 'selectall'}
        ]
    },
    {
        label: 'View',
        submenu: [
            {role: 'reload'},
            {role: 'forcereload'},
            {role: 'toggledevtools'},
            {type: 'separator'},
            {role: 'resetzoom'},
            {role: 'zoomin'},
            {role: 'zoomout'},
            {type: 'separator'},
            {role: 'togglefullscreen'}
        ]
    },
    {
        role: 'window',
        submenu: [
            {role: 'minimize'},
            {role: 'close'}
        ]
    },
    {
        role: 'help',
        submenu: [
            {
                label: 'My Blog',
                click() {
                    require('electron').shell.openExternal('https://www.mattepuffo.com')
                }
            }
        ]
    }
];

if (process.platform === 'darwin') {
    template.unshift({
        label: app.getName(),
        submenu: [
            {role: 'about'},
            {type: 'separator'},
            {role: 'services', submenu: []},
            {type: 'separator'},
            {role: 'hide'},
            {role: 'hideothers'},
            {role: 'unhide'},
            {type: 'separator'},
            {role: 'quit'}
        ]
    });

    // Edit menu
    template[1].submenu.push(
            {type: 'separator'},
            {
                label: 'Speech',
                submenu: [
                    {role: 'startspeaking'},
                    {role: 'stopspeaking'}
                ]
            }
    );

    // Window menu
    template[3].submenu = [
        {role: 'close'},
        {role: 'minimize'},
        {role: 'zoom'},
        {type: 'separator'},
        {role: 'front'}
    ];
}

const menu = Menu.buildFromTemplate(template);
Menu.setApplicationMenu(menu);

function createWindow() {
    win = new BrowserWindow({width: 800, height: 600});
    win.loadURL(url.format({
        pathname: path.join(__dirname, 'index.html'),
        protocol: 'file:',
        slashes: true
    }));

//    win.webContents.openDevTools();

    win.on('closed', () => {
        win = null;
    });
}

app.on('ready', createWindow);

app.on('window-all-closed', () => {
    if (process.platform !== 'darwin') {
        app.quit();
    }
});

app.on('activate', () => {
    if (win === null) {
        createWindow();
    }
});

Attivate e disattivate il menu per vedere le differenze con quello base.

Ovviamente potete modificarlo a vostro piacimento.

Enjoy!

I visualizzatori immagini hanno già la possibilità di visualizzare i dati EXIF delle immagini.

Ma su Linux esiste anche un ottimo tool da riga di comando, che ci permette anche di modificarli.

Per installarlo su Archlinux:

# pacman -S perl-image-exiftool

Electron è un framework, basato su Node.js, per la creazione di applicazione desktop usando Javascript e HTML.

Se pensate che su questo framework si basano programmi del callibro di Atom.io, Visual Studio Code e GitHub Desktop, vi renderete conto delle sue potenzialità.

Oggi vediamo un'introduzione basica.

Prima di tutto installiamo Electron (conviene farlo a livello globale):

# npm -g install electron

Siamo abituati ad avviare le distro Linux da CD o USB.

Ma in verità con GRUB2 è possibile avviarle direttamente da hard disk.

Prima di tutto scarichiamo la ISO che ci interessa (Ubuntu ad esempio, è sempre buona per fare questi test).

Per effettuare un ridimensionamento delle immagini in C#, non abbiamo bisogno di librerie esterne (anche se sono sicuro che ce ne stanno di ottime).

Ci basta usare il namespace System.Drawing.

Se siete dentro ad un progetto console, dovete aggiungere il reference.

Possiamo considerare ngrep come una estensione di grep per monitorare il traffico di rete.

Dovrebbe essere presente nei repo di praticamente tutte le distro; per installarlo su Archlinux:

# pacman -Sy ngrep

Ricordate che bisogna lanciarlo con privilegi elevati.