Archivi categoria: Programmazione

Azure Data Studio

Azure Data Studio

Azure Data Studio (ADS) è un nuovo ambiente di sviluppo database multi piattaforma in fase di sviluppo da parte di Microsoft. Infatti esiste nella versione Windows, MacOS e Linux. L’interfaccia e la modalità di interazione è la stessa di VSCode. L’ultima release, porta in dote diverse novità. Tra queste l’inclusione del concetto del Notebook. Un Notebook, non è un semplice documento di query, ma è composto da una serie di oggetti attivi, che possono essere “attivi” nello stesso momento, inframmezzati da testo o altro. In pratica è come avere un “quaderno” in cui scrivere tutto. Il Notebook più famoso e Jupiter Notebook, che serve ad eseguire script Python inframezzato da testo, grafici e altro.

Ed infatti in questa release di ADS un Notebook può avere un backend di codice SQL o Python. E qui iniziano i guai. Provando un nuovo Notebook con backend Python, ADS parte immediatamente con l’installazione di un proprio ambiente Python. Come risultato mi sono ritrovato con il mio ambiente Python/Anaconda “piallato”. È vero che ADS è in fase di sviluppo, ma sarebbe meglio prevedere un rilevamento di un ambiente già installato ed usare quello.

Per il resto i Notebook funzionano perfettamente, e sono perfettamente compatibili con quelli Jupiter (non so se si tratta di un’integrazione proprio di questi ultimi o solo compatibilità di file). Infatti avevo un Notebook in cui stavo seguendo gli esercizi del libro Hands-On Machine Learning with Scikit-Learn and TensorFlow e sono riuscito ad aprirlo senza problemi e proseguire lo sviluppo da ADS.

SQL server 2012 sp4 problem

Yesterday i decided to upgrade my installation of SQL Server 2012 (on Windows 10 professional) with the most recent serivice pack, the sp4. Everything works fine, until the at some step before completation, the setup ended wid the error:

Wait on the Database Engine recovery handle failed. Check the SQL Server error log for potential causes.

This error, leaved the sql server in a unstartable state. None work to recover the installation.

At this point, i decided to download and install a fresh copy o SQL Server 2016 developer edition. But also this setup failed with the same error. Every suggested solution do not works. At some point reading the SQL Server installation log, i found this line:

The code page 65001 is not supported by the server

What the hell?

After some search, i discovered that there is a new (beta) option in Windows 10 April 2018 update:
Beta: Use Unicode UTF-8 for worldwide language support

Basically this option force to use UTF-8 (65001 character set) in every windows function. But the secondary effect is that old(?) setup do not works anymore. To disable this option:

control panel->regional settings->administrative->change system locale

uncheck the option.

After that every setup works with no problem.

C# 7.0 in a Nutshell

C# 7.0 in a Nutshell è una guida completa all’ultima versione del C#, nata da Joseph Albahari, il creatore del famoso editor LINQPad, uno dei migliori ambienti in cui provare LINQ e non solo. Il libro si apre ovviamente con una panoramica generale sul linguaggio C#, poi si passa al sistema dei tipi, le basi per ogni buon linguaggio di programmazione. Poi si passa alle caratteristiche più avanzate del linguaggio, come le lambda expression, tuple, e direttive del pre-processore. Poi si passa alle varie interazioni del linguaggio con il framework .Net, sottostante. Notevole il capitolo sul namespace System.Diagnostics. Il libro affronta con dovizia di particolari la programmazione multiprocessore, partendo dei temi basilari sui thread, alle nuove classi Parallel.For e Parallel.ForEach, ed arrivare a PLINQ.

Non è un libro da comprare se vi interessano le Window Form o WPF.

RxJS

RxJS è l’acronimo di Reactive Extension for Javascript, è una libreria che si occupa di poter gestire in maniera molto semplice chiamate asincrone di qualsiasi tipo, per poter costruire programmi con interfaccia molto più “reattive”. L’idea di fondo è quella di eseguire le varie operazioni in maniera asincrona, e la libreria si occupa poi di riconciliare tutte le chiamate con i relativi programmi di gestione della risposta, in questo modo l’interfaccia non risulta bloccata sull’attesa della risposta al click del mouse su un pulsante, ma può proseguire la gestione degli eventi dell’interfaccia. Chi utilizza Angular, utilizza già questa libreria, forse neanche senza saperlo, per eseguire le chiamate alle WebAPI dell’applicazione: infatti i vari tool automatici di gestione delle WebAPI utilizzano RxJS per creare oggetti ad più alto livello, che utilizzano alla base RxJS. Un ottimo libro per esaminare a fondo questa libreria è RxJS in Action di Paul P. Daniels e Luis Atencio, il libro copre la versione 5 della libreria. Sarebbe utile conoscere i fondamenti della programmazione funzionale in Javascript prima di affrontare la lettura del libro, ma non è strettamente necessario. Il libro mostra con dovizia di esempi, come l’utilizzo della libreria renda semplice coinciso e chiaro la realizzazione della sincronizzazione di operazioni complesse, che richiederebbero complicate e oscure routine di programmazione classica.

Programmazione funzionale

La programmazione funzionale sta diventando sempre più importante nel mondo dello sviluppo, sopratutto quello Web. Un buon libro che affronta l’argomento utilizzando come linguaggio Javascript è il libro di Michael Fogus Javascript Functional pubblicato da O’Relley. Nel libro vengono affrontati i vari aspetti della programmazione funzionale, e poi vengono declinati in applicazioni Javascript. La libreria funzionale di riferimento utilizzata per gli esempi è Underscore.Js, ma per chi sviluppa applicazioni Web dovrebbe essere noto che JQuery, la regina delle librerie Web, è pienamente aderente ai dettami della programmazione funzionale.

Font blurry in Visual Studio 2017

If you have a pc with double (or more) monitor, with different DPI scale settings, you may have experienced fonts blurry in Visual Studio 2017 or Sql Manager. I have followed different solution proposed here. But the only tha worked form me is this.

12-07-2018

Too beautiful to be true, with the latter settings  VS Debugger do not work anymore!

13-07-2018

The definitive solution here.

 

River crossing problem

In the book From Bacteria to Bach and Back by Daniel Dennet there is this note:

Four people come to a river in the night. There is a narrow bridge, and it can only hold two people at a time. They have one torch and, because it’s night, the torch has to be used when crossing the bridge. Person A can cross the bridge in one minute, B in two minutes, C in five minutes, and D in eight minutes. When two people cross the bridge together, they must move at the slower person’s pace. The question is, can they all get across the bridge in fifteen minutes or less?

This is a well know crossing problem like wolf cabbage and goat problem. Many of this problem are solved by simple Prolog program. But now i want solve this problem with a functional language: F#. A simple solution is (based on this):

open System

//cambia per trovare soluzioni in tempi diversi
let MAX_TIME = 15

type Person = 
  | Person of string * int

type Direction =
  | L
  | R

type Move =
  | Move of Direction * Person list

//estende il modulo List
module List =
  let rec combinations items =
    [
      match items with
      | [] -> ()
      | x::xs ->
        for y in xs do yield x, y
        yield! combinations xs
    ]

let rec Solve cost moves atStart atEnd dir =
  seq {
    if cost > MAX_TIME then ()
    elif Set.isEmpty atStart then yield cost, List.rev moves
    else
      match dir with
      | L ->
        for Person(_, time) as person in atEnd do
          let move = Move(dir, [person])
          yield! Solve (cost + time) (move :: moves) (Set.add person atStart) (Set.remove person atEnd) R
      | R ->
        let combinations = List.combinations (Set.toList atStart)
        for (Person(_, time1) as person1), (Person(_, time2) as person2) in combinations do  
          let move = Move(dir, [person1; person2])
          let persons = set [person1; person2]
          yield! Solve (cost + (max time1 time2)) (move :: moves) (atStart - persons) (atEnd + persons) L
  }      

let Persons =
  set [
    Person("A", 1)
    Person("B", 2)
    Person("C", 5)
    Person("D", 8)
    //Person("E", 1)
  ]

Solve 0 [] Persons Set.empty R
|> Seq.iter (printfn "%A")

 

Executing the program yield the following output (can be executed as is in LINQPad):

(15,
 [Move (R,[Person (“A”,1); Person (“B”,2)]); Move (L,[Person (“A”,1)]);
  Move (R,[Person (“C”,5); Person (“D”,8)]); Move (L,[Person (“B”,2)]);
  Move (R,[Person (“A”,1); Person (“B”,2)])])
(15,
 [Move (R,[Person (“A”,1); Person (“B”,2)]); Move (L,[Person (“B”,2)]);
  Move (R,[Person (“C”,5); Person (“D”,8)]); Move (L,[Person (“A”,1)]);
  Move (R,[Person (“A”,1); Person (“B”,2)])])

So the puzzle have two equivalent solution.

Playing with set of Persons and MAX_TIME constant, is possible to explore solution for different problem.