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);
            }         
        }
    }
}