sabato 19 agosto 2017

Copia di file su server remoto senza password

Testato  con Ubuntu 16.04.3

Il metodo più semplice e sicuro è usare le chiavi SSH
Verificare che in /etc/ssh/sshd_config sia configurato
PubkeyAuthentication yes

$ scp -i .ssh/id_rsa source_path user@server:/destination_path .

id_rsa è la chiave privata generata con:
 
$ ssh-keygen -t rsa

La chiave pubblica id_rsa.pub deve essere copiata sul server dentro  ~user/.ssh/authorized_keys

$ ssh-copy-id -i .ssh/id_rsa.pub user@server

Una guida molto chiara è qui
Una guida per i server synology è qui e qui

La password mi veniva comunque richiesta e ho tribolato un po' per trovare l'errore.
Prima di tutto ho lanciato il comando in modalità debug

$ ssh -vv -i .ssh/id_rsa user@server

debug2: we did not send a packet, disable method
debug1: Next authentication method: password

Il passaggio successivo è stato consultare sul server il file /var/log/auth.log dove era finalmente riportato l'errore:

sshd[3471]: Authentication refused: bad ownership or modes for directory /home/user/.ssh

Infine

$ chmod 755 /home/user/.ssh

mercoledì 16 agosto 2017

Come individuare la lingua di una stringa in C#

Metti caso che vuoi sviluppare un sistema per determinare la lingua di una frase.
Uno dei metodi migliori sembra essere addestrare un classificatore, ma se i dati di partenza non sono corretti i risultati non saranno soddisfacenti. Un classificatore è un classico sistema Garbage in, Garbage out.
Quindi per sviluppare un sistema per determinare la lingua di una frase potrebbe essere utile disporre di un altro sistema per determinare la lingua di una frase,  in modo da filtrare i dati che servono per l'addestramento.
Da Windows 7 in poi si possono usare gli Extended Linguistic Services.
Su NuGet è disponibile un wrapper C# WindowsAPICodePack-ExtendedLinguisticServices

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.WindowsAPICodePack.ExtendedLinguisticServices;
using System.Diagnostics;
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            MappingService langDetect = new MappingService(MappingAvailableServices.LanguageDetection);
            using (MappingPropertyBag bag = langDetect.RecognizeText("good morning vietnam", null))
            {
                string[] languages = bag.GetResultRanges()[0].FormatData(new StringArrayFormatter());
                foreach (string lang in languages)
                    Console.WriteLine(lang);
            }         
        }
    }
}

 
 

venerdì 23 giugno 2017

Dettatura in italiano con Cortana. Qualcosa si sta muovendo

Finalmente le API di Cortana sono state utilizzate per creare un addin per Word e le altre applicazioni Office.
L'addin si chiama Dictate ed è un progetto Microsoft Garage.
Non solo trascrive, ma anche traduce in decine di lingue.
Una manna per gli antichi come me che si ostinano a usare Word invece di Chrome e Google docs.
Una volta attivato l'addin, Cortana non scrive in Word ma nella finestra correntemente attiva, per cui potreste anche scrivere in Wordpad o Notepad mentre sono in primo piano.
Per ora il grosso limite è che non permette di modificare il vocabolario.
Il sistema funziona benissimo in un contesto generico adatto ai creativi, ma i creativi preferiscono usare la tastiera.
Il vocale viene invece utilizzato da coloro che vengono spremuti sul lavoro per scrivere, che so, referti di TAC al torace piuttosto che relazioni sulle caldaie, ma questi hanno bisogno di un vocabolario tecnico e perciò il sistema in sé è ancora poco utile.

venerdì 9 giugno 2017

Come calcolare la frequenza delle parole in un testo in C#

Calcolare la frequenza delle parole in un testo è un problema puramente accademico perché esistono già centinaia di programmi ed esempi di codice pronti per l'uso.
Dovendo comunque scrivere del codice, essendo pigro di natura, sono sempre alla ricerca della procedura più semplice e più breve possibile, ovviamente in C#
L'esempio contempla l'uso delle stopwords


//Testo da esaminare. Ho provato con files fino a 500MB senza attese fastidiose
string text = File.ReadAllText(path, Encoding.Default);

//caratteri separatori che identificano i limiti di una parola
char[] separators = new char[] { ' ', '\r', '\n', ',', '\\', '.', ';', ':', '(', ')', '"', '?', '!', '\'', '-', '«', '/' };

//lista delle parole contenute in text
List<string> words = text.Split(separators, StringSplitOptions.RemoveEmptyEntries).ToList();

//lista delle parole da escludere dal conteggio, le cosiddette stopwords, ad esempio congiunzioni, articoli e preposizioni
List<string> stopwords = File.ReadAllLines("StopWords.txt", Encoding.Default).ToList();

//Rimuove dalla lista le stopwords
//Non è possibili utilizzare Except perché fa una DISTINCT e annulla le frequenze
//Ho trovato molti forum in cui si chiede come utilizzare Contains in modo case insensitive
//O la documentazione è poco chiara o quei post si riferiscono a una versione di .NET antica
//La soluzione è semplice: utilizzare StringComparer
words.RemoveAll(item => stopwords.Contains(item, StringComparer.OrdinalIgnoreCase));

//Infine LINQ per contare le frequenze e presentarle in ordine discendente
var frequencies = words.GroupBy(n => n).Select(n => new { Value = n.Key, Count = n.Count() }).OrderByDescending(a => a.Count);

martedì 23 maggio 2017

Come convertire un file .wav (o un audio qualsiasi) in un filmato .mp4 o un altro formato video

A cosa serve convertire un audio in un filmato?
Non ho trovato altre motivazioni se non caricare un file audio su YouTube.
Ci sono applicazioni desktop e web che già fanno questa conversione, ma se si deve farlo a riga di comando le API di Windows sono di grande aiuto
Ecco il codice di una applicazione console che usa l'oggetto MediaComposition

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Windows.Media.Editing;
using Windows.Media.MediaProperties;
using Windows.Media.Transcoding;
using Windows.Storage;


namespace Audio2Video
{
class Program
{
static private string filePath;

static void Main(string[] args)
{

if (args.Length != 1)
{
Console.WriteLine("Usage: Audio2Video ");
return;
}

filePath = args[0];
if (!File.Exists(filePath))
{
Console.WriteLine("The file {0} doesn't exist", filePath);
return;
}

Audio2Video().GetAwaiter().GetResult();

}

static async Task Audio2Video()
{
MediaComposition composition = new MediaComposition();

StorageFile inputFile = await StorageFile.GetFileFromPathAsync(filePath);
var audioproperties = await inputFile.Properties.GetMusicPropertiesAsync();
string video = Path.ChangeExtension(filePath, ".wmv");
File.Create(video).Dispose();
StorageFile outputFile = await StorageFile.GetFileFromPathAsync(video);

var backgroundTrack = await BackgroundAudioTrack.CreateFromFileAsync(inputFile);
composition.BackgroundAudioTracks.Add(backgroundTrack);

var clip = MediaClip.CreateFromColor(Windows.UI.Color.FromArgb(0,0,0,0), audioproperties.Duration);
composition.Clips.Add(clip);

var profile = MediaEncodingProfile.CreateWmv(VideoEncodingQuality.Qvga);

// Call RenderToFileAsync
var saveOperation = await composition.RenderToFileAsync(outputFile, MediaTrimmingPreference.Fast, profile);

}
}
}

lunedì 25 luglio 2016

Barbarie nel traffico

New Entries
- In una grande città deserta nel weekend di Ferragosto parcheggiare in divieto di sosta per non fare cinque metri in più
- Città deserta, un solo pedone e una sola auto all'orizzonte. L'auto inchioda per non investire il pedone sulle strisce. Segue discussione che blocca le poche macchine circolanti.

Questa mattina tutte a me:
  1. parcheggiare in doppia fila davanti alla mia macchina
  2. svuotare al semaforo il portacenere dal finestrino
  3. impegnare l'area di intersezione di un incrocio anche quando la circolazione è bloccata (effetto tappo)
  4. parcheggiare in doppia fila all'altezza di un'altra macchina in doppia fila in direzione opposta (effetto imbuto)
  5. procedere ad andatura lentissima al centro della strada e infine passare col giallo quasi rosso
  6. guidare col telefono in mano senza lasciar intendere le traiettorie che si intraprenderanno

domenica 29 maggio 2016

Dettatura in italiano con Cortana

Sebbene quella del riconoscimento vocale sia ormai una tecnologia mainstream, il suo utilizzo è ancora piuttosto scarso a causa di un limite culturale o, più probabilmente, per la mancanza di interfacce vocali ben fatte.
Android e Apple Ios hanno i propri sistemi di dettatura integrati così come Windows, ma fino a Windows 7 l'unico modo per dettare in Italiano con i sistemi operativi Microsoft era installare un software commerciale come Dragon NaturallySpeaking.
Con Cortana e Windows 10 siamo passati alla seconda generazione dei motori di riconoscimento vocale, grazie all'utilizzo di modelli basati sulle reti neurali profonde (DNN).
Microsoft ha reso disponibile il riconoscimento vocale in decine di lingue, ma mancano le applicazioni che lo utilizzano tant'è che a oggi è possibile solamente dettare degli SMS con Windows phone oppure rivolgere delle domande a Cortana. Dettare delle email o un documento in Word è possibile in potenza ma di fatto manca ancora l'integrazione con Cortana.
Eppure le API ci sono. Basta avere Windows 10 e un collegamento a internet perché Cortana trascriva la nostra voce in tempo reale.
Le API di Cortana sono API WinRT, cioè pensate per le App Windows Store ma, esattamente come descritto nel post per le API OCR, è possibile utilizzarle in una normale applicazione desktop.
Qui un semplice progetto WPF che integra le API Windows.Media.SpeechRecognition con cui potrete giudicare l'accuratezza di Cortana.
Richiede Windows 10, l'accesso a Internet e l'input audio microfonico.
Quando terminate di parlare premete il pulsante Stop altrimenti il sistema produrrà un Timeout.
E qui l'esempio ufficiale di Microsoft

Update 23/06/2017: addin Office per la dettatura