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
- Jos esim. haluat ostaa domain-mallisi muualta ja itse keskittyä vain liiketoimintalogiikkaan.
- http://datamarket.azure.com/browse/data?price=free
- 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:
- 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
- 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:
- Hae Freebase:sta (Commons.Government alta) lista USA:n presidenteistä. Vain nimet.
- Sijoita tilapäismuuttujaan niin, ettei kyselyitä tule liian usein.
- 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.
- Kysely-toiminto:
- Arvo kummastakin listasta yksi nimi ja esitä ne satunnaisjärjestyksessä kumpi-kysymyksen muodossa.
- Tarkistus-toiminto:
- Ota parametrina nimi ja tarkista löytyykö annettu nimi presidentti-listalta.
Harjoitustehtävä 2
Maailma on täynnä avoimia API-rajapintoja:
- Suomalaisia:
- Reittiopas,
- VR,
- Ontologia API
- Ninchat API
- Avointen palveluiden listaus.
- Kansainvälisiä:
- Luultavasti kaikki isot yritykset kuten YouTube, Amazon, jne.
- Finanssi-feed-lista
- BTC: Quandl, BTC-e, LocalBitcoins
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.
Full name: DataUsageFin.data
Full name: DataUsageFin.Helsinki10
from Microsoft.FSharp.Collections
Full name: Microsoft.FSharp.Collections.Seq.take
Full name: Microsoft.FSharp.Collections.Seq.map
Full name: Microsoft.FSharp.Collections.Seq.iter
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
(+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)
Full name: Microsoft.FSharp.Collections.Seq.head