Merhaba F#

“Adamlar insan beyni ile yapay zekayı bir araya ha getirdi ha getirecek, sen hala Merhaba {PROGRAMLAMA_DILI} modundasın, peh!”

Önce böyle taşladım kendimi, evet. Öğrenmenin yaşı var mıdır yok mudur, bilmiyorum. Ama öğrenmenin ve bu yolda olmanın hazzını bir çok şeye değişmem bundan eminim.

Bugün Hürriyet IT ekibinin bir bölümü olarak Istanbul Tech Talks 2017 etkinliğindeydik. En baştan belirtmem gerekir ki son dönemlerde katıldığım en keyifli ve doyurucu teknoloji etkinliklerinden biriydi. Emeği geçen, organizasyondan sorumlu tüm arkadaşlara bir de buradan teşekkür etmek gerekiyor.

Etkinliğin benim için önemli oturumlarından birisi Rachel Reese’in konuşmacı olduğu, “Consuming Data with F# Data Providers” oldu. F# ile ilk tanıştığım zamanları hatırlıyorum. 2010 sonları idi. Sanıyorum # dili ailesinin bir üyesi olması bende merak uyandırdı. Sonraları ise uzmanlaştığım konu gereği “fonksiyonel programlama” ile çok fazla haşır neşir olamadım ve tanışıklığımız da “e o zaman bir çay içelim” seviyesinde kaldı.

İtiraf etmek gerekirse veri madenciliği (Data mining), büyük veri (Big data) gibi kavramlar da çok uzun bir süre ilgi alanıma girmedi. “Bebek bezleri ile biralar markette yan yanaymış, çünkü bebek bezi almaya gelen babalar alışverişlerine mutlaka birayı da dahil ediyorlarmış. Bunu bulmak için de {X}, {Y} ve {Z} gibi teknolojileri kullanıyorlarmış” hikayesi bana bu konunun önemini yeteri kadar idrak ettirmiş olmalı :)

Şimdi ise büyük verinin ekmek/su kadar önemli; hızlı ve tutarlı veri işlemenin nefes almak kadar sistematik olduğu bir ekosistemin içerisindeyim. Bu işlerle ilgilenen arkadaşlarımla konuşurken de R, Scala, F# teknolojileri bol bol duyuyorum. Bugün de programda bu konuyu görünce çayla kaldığım eski dostuma tekrar bir dönüp bakayım istedim.

İlk zamanlar aldığım notlarıma bakınca, dilde çokça gelişme olduğunu gördüm. Tüm bildiklerimi unutup sıfırdan başlamanın daha doğru olacağına kanaat getirdim ve küçük bir örnek ile de bu kanaatimi eyleme döktüm. İlginizi çekecek olursa örneğimi kısaca açıklamak ve kendime not düşmek isterim.

Logo — F#

Geliştirme ortamı olarak, aşina olduğum Visual Studio (2015)’yu kullandım. İlk kurulum esnasında sanırım F# ortamını yüklememişim, dolayısıyla 15–20 dakika kadar ortamın yüklenmesini bekledim ve geliştirme adımına temiz bir şekilde geçiş yaptım.

Bu noktada belirtmekte fayda var, geliştirme ortamım bana biraz yavaş geldi (C# ile karşılaştırdığımda). İnternette biraz araştırma yaptığımda ise F#’ın GPU kodları da ürettiği için bir nebze yavaşlığın normal olduğu bilgisini edindim. Çok fazla yerde teyid edemediğim için (sıcağı sıcağına bu yazıyı yazıyorum) net olarak “budur” diyemiyorum. Ekleyecekleriniz olursa yorum alanından değerli bilgilerinizi beklerim.

Hedef

Dünya kupası tarihinde en çok maç oynayan, gol atan ülkeleri ve gol ortalamalarını görselleştirmek

Çıktı

Kaynak: https://en.wikipedia.org/wiki/All-time_table_of_the_FIFA_World_Cup

Tablo mu yapsam, line chart mı daha güzel olur, bar chart çok mu detaylı olur gibi sorulara cevap ararken bu harita örneğini internette gördüm ve bu örnek için biçilmiş kaftan dedim. Tabii bu noktada gol ortalamaları için görsel bir alan düşünemedim ama bir sonraki çalışmam için elimde ekstra veri kaldı (bardağın dolu tarafı).

Çalışma — Üretim

Sadece 29 satırda (fonksiyonel işlemlerin boş satırlarla ayrılması dahil) bu çıktıyı üretmek açıkçası çok hoşuma gitti. Tabii ki hazır bir kütüphane (Google Charts) ile bu çıktıyı ürettim (internet ortamında çizimi elle yapan geliştiriciler de var, takdire şayan).

Öncelikle kullanacağımız referans kütüphaneleri ekliyoruz:

Her iki kütüphaneyi de Nuget üzerinden indirebilirsiniz.

Hemen ardından hesaplama/görselleştirme işleminde kullanacağımız verilere ulaşmak için gerekli bilgileri yazıyoruz:

Bu noktada, etkinlik konusu olan “F# — Data Providers” devreye giriyor. Gördüğünüz gibi “HtmlProvider” adlı bir nesne, başka herhangi bir bilgi vermeden ilgili sayfaya gidiyor, içerikleri alıyor ve formal bir şekilde kullanıma sunuyor. Daha da enteresanı, geliştirme esnasında içerikler “Intellisense” ile sunuluyor (yavaşlığın nedenlerinden biri de aslında bu). Dolayısıyla “XPath ile sayfayı dolaş, HTML parse et” gibi dertler bu noktada devre dışı kalıyor. Bunun gibi SQLProvider, XMLProvider, JSONProvider, FacebookProvider onlarca hazır provider kullanıma sunulmuş durumda. Tabii “DataProvider”ların en önemli kuralını unutmamakta fayda var: Provider’ların stabil çalışabilmesi için, ulaşmak istediği veri kaynağı da stabil bir yapıya sahip olmalıdır. Yani “structural data” prensibi burada önemli.

Sırada veriye programatik olarak ulaşmak var:

Yukarıda bahsettiğim “Intellisense” desteği 3. ve 4. satırı yazarken tablo ve satır isimlerini otomatik doldurarak zuhur ediyor. 5. satırda gelen veriyi bir Array olarak karşıladığımızı belirtiyor; 6. satırda takım isimlerindeki bazı karakterleri temizliyor (bazı ülke isimleri Wikipedia formatından kaynaklı Almanya[1], Vietnam[2] gibi geliyor); 7. satırda işlenecek veriyi son formuna getiriyor; 8. satırda ise son formundaki veri kümesini gol sayısına göre sıralıyoruz.

Geriye kalan ise bu veriyi görselleştirecek kodu yazmak ve uygulamayı çalıştırmak:

İlk 4 satırda renk skalası için gerekli ayarlamayı yapıyoruz. Buna göre en az gol atan takımlar haritada sarı ile boyanacak iken, gol sayısı arttıkça renk tonu kırmızıya doğru yükselecek. 6. satırda görsel için veri kaynağını; 7. satırda görselin tipini; 8. satırda daha önce tanımlamasını yaptığımız özelliklerle görselin çizileceğini; 9. satırda verilerin etiketlerini ve son satırda ise görselin çizim komutunu belirtiyoruz.

Evet, hepsi bu :) Yukarıdaki kodları sırasıyla alıp bir F# projesine eklediğinizde ve çalıştırdığınızda yukarıdaki görselle karşılaşmanız işten bile değil.

Bu örneği hazırlarken ve F# çalışmaya başlarken şimdilik aşağıdaki kaynaklardan yararlandım. Daha fazla örnek yaptıkça — ve fırsat bulup bu mecraya ekleyebilirsem — paylaşıma devam edeceğim. Bu noktada eklemek/düzeltmek istediğiniz şeyler olursa lütfen benimle paylaşın.

Tekrar görüşmek dileğiyle…

Kaynaklar:

  1. http://fsharp.org/
  2. https://en.wikipedia.org/wiki/F_Sharp_(programming_language)
  3. http://evelinag.com/blog/2015/11-18-f-tackles-james-bond/#.WOJZZDvyhPY
  4. http://fsharp.github.io/FSharp.Data/index.html