The Greater Helsinki Area F# User Group - F# & Azure - FI EN

Informaatiorikas ohjelmointikieli

Nykyään F#-kielessä kääntäjä osaa kääntää eri tietolähteitä osaksi ohjelmointikielen tyyppijärjestelmää niin, että esim. koodaajalla toimii intellisense (kirjoitusaikainen syntaksitarkistus).

Näitä "TypeProvider" tietolähteitä on olemassa mm. seuraavia:

  • JSON-datalähteille (ja XML-tietolähteille)
    • Perus-web-serviceiden schemat. Vähän sama kuin, että generoisi Service-referenssejä, mutta kääntäjä tekee sen puolestasi.
  • CSV-tiedostoille
    • On-line-dataa tarjotaan paljon myös CSV-muodossa.
  • FreeBase-nettitietokannalle
    • Freebase on tietokanta, johon on koostettu tietoa useista eri tietolähteistä. Täältä ei saa helposti tietorakenteita, eikä reaaliaikaista dataa, mutta kylläkin sekalaisia data-listoja itsessään.
  • WorldBankille
    • Maailmanpankki on YK:n alla toimiva järjestö, josta saa tietoa eri maista.
  • SQL-palvelimelle
    • Vähän sama kuin generoisi EF-tietomallin, mutta jälleen, kääntäjä hoitaa kaiken, et voi mennä itse sörkkimään väliin, mikä on hyvä juttu.
  • Azure Marketplace
  • Ja näitä voi tehdä itse lisää...

Testataan muutamia, käyttäen FSharp.Data-kirjastoa. Voit käyttää aiemmin tehtyä WorkerRole-projektia. (Tarvitset nettiyhteyden ja näitä käytettäessä Visual Studio saattaa kysyä lupaa netin käyttämiseen, vastaa "Enable".)

FreeBase TypeProvider

(Jos saman IP:n takaa tulee paljon liikennettä, Freebase blokkaa anonyymin liikenteen, silloin odota hetki tai käytä Googlen rekisteröintiä.)

Voit käyttää interactivea testaamaan alla olevaa koodia (kunhan hakemistopolun versionumero, 2.0.5, on NuGet-pakettia vastaava):

 1: 
 2: 
 3: 
 4: 
 5: 
 6: 
 7: 
 8: 
 9: 
10: 
11: 
12: 
13: 
14: 
15: 
16: 
#if INTERACTIVE
#r "../packages/FSharp.Data.2.0.7/lib/net40/FSharp.Data.dll"
#endif

open FSharp.Data
//[<Literal>]
//let FreebaseApiKey = "<freebase-enabled google API key>"
//type FreebaseDataWithKey = FreebaseDataProvider<Key=FreebaseApiKey>

let data = FreebaseData.GetDataContext()
let Helsinki10 = 
    data.Commons.Business.``Stock exchanges``.Individuals.OMXH.``Companies traded``
    |> Seq.take 10
    |> Seq.map (fun company -> company.``Ticker symbol``)

let iterated = Helsinki10 |> Seq.iter System.Console.WriteLine

Testaa myös muita "data." ja "data.Commons." -alta löytyviä settejä. Huomaa Visual Studion Intellisense samalla kun kehität:

Tämän TypeProviderin laajempi käyttö vaatii reskisteröitymisen ja API-keyn parametriksi metodille GetDataContext().

CSV TypeProvider

Edellisestä saatiin siis lista Helsingin pörssin osakkeista.

CSV-type-provider toimii TypeProviderille tyypillisellä tavalla:

  1. Tarvitsemme kovakoodatun Scheman, tiedon muodon. Tämä on yleensä jonkinlainen otos vanhaa dataa, johon viitataan kehityskoodissa.
    • Lisää projektiin uusi tiedosto, TextFile1.csv
    • Tallenna sen sisällöksi tämä:

      1: 
      2: 
      3: 
      4: 
      5: 
      
      Date,Open,High,Low,Close,Volume,Adj Close
      2012-01-27,29.45,29.53,29.17,29.23,44187700,29.23
      2012-01-26,29.61,29.70,29.40,29.50,49102800,29.50
      2012-01-25,29.07,29.65,29.07,29.56,59231700,29.56
      2012-01-24,29.47,29.57,29.18,29.34,51703300,29.34
  2. Tarvitsemme reaaliaikaisen datanlähteen
    • Käytämme Yahoo Finance-palvelua. Vastaavia nettipalveluita on muitakin, mutta tätä muutkin käyttävät.

Jatketaan edellisen logiikan perään: nyt voit hakea dataa oheisella koodilla:

1: 
2: 
3: 
4: 
let symbol = "NOK" // symbols |> Seq.head
type Stocks = CsvProvider<"TextFile1.csv">
let quotes = Stocks.Load("http://ichart.finance.yahoo.com/table.csv?s=" + symbol)
let ``Last day in USD`` =  quotes.Rows |> Seq.head

Valitettavasti Yahoon USD-EUR-kurssi ei ollut ajan tasalla, joten se on haettava jostain muualta.

Jos kirjoitit tiedostonimen TextFile1.csv oikein, niin tässäkin intellisense osaa tyypittää sarakkeet oikein ja jopa tietomuodot (System.DateTime, decimal, jne):

Harjoitustehtävät

Harjoitustehtävä 1

Tee ohjelma, joka kyselee "kumpi oli presidentti":

Kumpi oli presidentti, Richard Burton vai Gerald Ford?

Ohjelman toimintaperiaate:

  1. Hae Freebase:sta (Commons.Government alta) lista USA:n presidenteistä. Vain nimet.
    • Sijoita tilapäismuuttujaan niin, ettei kyselyitä tule liian usein.
  2. Hae Freebase:sta (Commons.Film alta) lista näyttelijöistä. Vain nimet. Ota vain 50 ensimmäistä.
    • Sijoita tilapäismuuttujaan niin, ettei kyselyitä tule liian usein.
  3. Kysely-toiminto:
    • Arvo kummastakin listasta yksi nimi ja esitä ne satunnaisjärjestyksessä kumpi-kysymyksen muodossa.
  4. Tarkistus-toiminto:
    • Ota parametrina nimi ja tarkista löytyykö annettu nimi presidentti-listalta.

Harjoitustehtävä 2

Maailma on täynnä avoimia API-rajapintoja:

Rekisteröidy käyttäjäksi johonkin, ja tutki API-rajapintaa JSON-TypeProviderin avulla.

Jos tarvitset usein SQL-palvelinta, voit myös koittaa käyttää SqlEntityConnection-TypeProvideria.

Takaisin valikkoon

namespace Microsoft.FSharp.Data
val data : obj

Full name: DataUsageFin.data
val Helsinki10 : seq<obj>

Full name: DataUsageFin.Helsinki10
module Seq

from Microsoft.FSharp.Collections
val take : count:int -> source:seq<'T> -> seq<'T>

Full name: Microsoft.FSharp.Collections.Seq.take
val map : mapping:('T -> 'U) -> source:seq<'T> -> seq<'U>

Full name: Microsoft.FSharp.Collections.Seq.map
val company : obj
val iterated : unit
val iter : action:('T -> unit) -> source:seq<'T> -> unit

Full name: Microsoft.FSharp.Collections.Seq.iter
namespace System
type Console =
  static member BackgroundColor : ConsoleColor with get, set
  static member Beep : unit -> unit + 1 overload
  static member BufferHeight : int with get, set
  static member BufferWidth : int with get, set
  static member CapsLock : bool
  static member Clear : unit -> unit
  static member CursorLeft : int with get, set
  static member CursorSize : int with get, set
  static member CursorTop : int with get, set
  static member CursorVisible : bool with get, set
  ...

Full name: System.Console
System.Console.WriteLine() : unit
   (+0 other overloads)
System.Console.WriteLine(value: string) : unit
   (+0 other overloads)
System.Console.WriteLine(value: obj) : unit
   (+0 other overloads)
System.Console.WriteLine(value: uint64) : unit
   (+0 other overloads)
System.Console.WriteLine(value: int64) : unit
   (+0 other overloads)
System.Console.WriteLine(value: uint32) : unit
   (+0 other overloads)
System.Console.WriteLine(value: int) : unit
   (+0 other overloads)
System.Console.WriteLine(value: float32) : unit
   (+0 other overloads)
System.Console.WriteLine(value: float) : unit
   (+0 other overloads)
System.Console.WriteLine(value: decimal) : unit
   (+0 other overloads)
val head : source:seq<'T> -> 'T

Full name: Microsoft.FSharp.Collections.Seq.head

Creative Commons -copyright Tuomas Hietanen, 2014, thorium(at)iki.fi, Creative Commons