Neden Scala?
Türkiye Scala Kullanıcıları Topluluğu
* Google Groups - Scala-turkiye
* Github
* https://github.com/organizations/scala-turkiye
Anahatlar
- Scala'nın Türykiye'deki Gelişimi
- Scala: Özet-Geç!
- Neden Scala'ya ihtiyaç duyuldu
- Kullananların Tecrübeleri
- Süre kıstılı, sorular en son
- Bir sonraki sunum Mehmet Ali Gözaydın MongoDB + Play/Scala
Gelişim
- 2011 Haziran. Scala Videoları
- En çok izlenen Video
- En çok ikinci izlenen Video Lambda-Calculus
- http://vimeo.com/csenol
- 2012 Nisan. Chris Hoca OYLG2012 Sunumu Fonksiyonel Diller üzerine
- 2012 Coursera Functional Programming in Scala. En başarılı Coursera Dersi
- 2012 OOPSLA Ayrı bir konferans değil
- ICFP ye gelen makale sayısı ECOOP ya gelenin 3 katı
- 2012 Kasım. Turkiye Scala Kullanıcıları Topluluğu
- https://github.com/organizations/scala-turkiye
- 2013 Nisan. Türkiye'de Scala kullanan firmalar.
Scala Neydi?
- Nesne Yönelimli
- Fonksiyonel Programlama
- Güçlü Tip Sistemi
- Java uyumlu
- Java'daki tüm kütüphaneleri Scala'dan çağırmak mümkün
- Repl - Experiment Driven Development
- Actor ler ve Future/Promise lar.
Nesne Yönelimli
- Javadaki'nin aksine herşey nesne. Ruby gibi
- Static method/field ler ayrı.
- Çoklu Kalıtım(Mixin Composition). Traitler
- Diamond Problem'i lineerleşitrerek çözüyorlar.
- Case Classlar
case class Person(name:String, age:Int)
val p = Person("ali", 15)
Fonksiyonel Programlama
- Immutable ol.
- x = x + 1 ???
- Daha kolay mantik yurut. Bug bul
- Concurrency
- Fonksiyonlar 1. sınıf ve closurelar var.
- Lazy Eval.
- Pattern Matching
val lon = List(1,2,3,4)
val aon = Array(1,2,3,4)
val added1 = lon.map(x => x + 1)
val added2 = aon.map(x => x + 2)
lazy val connection = //db baglantisi ac.
Güçlü Tip Sistemi
- Type Inference
- type keywordu
- Null Pointer Exception!!!!!
- Option Monad'ı yardıma koşuyor.
type Complex = HashMap[Int, List[Set[Person]]]
val ds = new Complex
val age = post.getData("age").toInt // Compile hatasi!!
val age2 = post.getData("age").getOrElse(0)
Tanımlar
Yatay ölçekleme (Scala out/Scale down)
- Dağıtık bir uygulamaya yeni bir düğüm(node) eklemek ya da çıkarmak.
Dikey ölçekleme (Scale up)
- Tek bir düğüme CPU ya da bellek gibi yeni kaynak eklemek.
Parallelism
- Paralel donanımlar üzerinde programları daha hızlı koşmak.
Concurrency (Eş zamanlılık)
- İş parçacıklarının eş-zamanlı olarak koşmalarını yönetmek.
Concurrency problemi
var x = 0
async { x = x + 1 }
async { x = x * 2 }
// muhtemel sonuçlar 0, 1, 2
- Eş-zamanlı iş parçacıklarının paylaşımlı değişken durumlara(mutable shared state) erişmesi rasgeleliğin sebebidir.
Senkronizasyon maliyeti
- Mutable state varsa eş zamanlı çalışmanın senkronize edilmesi gerekir.
- Java’da aşağıdaki senkronizasyon araçları mevcuttur.
- Atomik veri yapıları (AtomicInteger, ...)
- Synchronized bloklar
- CountDownLatch, CyclicBarrier, Semaphore
- Eğer uygulamanızda mutable state yoksa senkronizasyon gibi bir sorununuz da yoktur.
Threaded vs Evented
Threaded: Servlets, Ruby on Rails, Django, PHP
Evented: Play, Node.js, Twisted
Threaded sunucular
- Her bir isteğe bir thread atarlar
- Thread cevap gönderilene kadar tüm işleri gerçekleştirirler.
- Uzak bir servis çağrısı gibi herhangi bir I/O senkrondur.
- Bu sebeple thread bloklanır ve I/O işlemi tamamlanana kadar boş oturur.
Blocking Scala kodu
// Apache HttpClient ile example.com'dan bir istek yapılıyor.
val client = new HttpClient()
val method = new GetMethod("http://www.example.com/")
// executeMethod blocking, senkron bir çağrıdır
val statusCode = client.executeMethod(method)
// Bu satır çalıştığında example.com'dan cevap alındığından eminiz.
println("Server responsed with %d".format(statusCode))
Sınırsız thread oluşturmanın dezavantajları
Thread yaşam döngüsü maliyeti
- Thread oluşturma ve öldürme maliyetsiz değildir.
- Sunucu uygulamalarında istekler sık ve küçük.
- Her bir istek için yeni bir thread
- Yüksek kaynak tüketimi.
Sınırsız thread oluşturmanın dezavantajları
Kaynak tüketimi
- Aktif threadler sistem kaynaklarını(özellikle bellek) kullanırlar.
- Kullanılabilir işlemci sayısından daha fazla thread var ise threadler boş dururlar.
- Boş duran threadler gereksiz yere bellek kullanırlar.
- İşlemciler için yarışan çok sayıda thread var ise bu durum ayrıca performans kaybına sebep olabilir.
Sınırsız thread oluşturmanın dezavantajları
Kararlılık
- Oluşturulabilecek thread sayısı sınırlıdır.
- Bu sınır stack size gibi parametrelere ve işletim sisteminin sınırlarına bağlıdır.
- Bu sınıra ulaştığınızda OOM gibi bir yanıt alırsınız.
- Bu durumu düzeltmeye çalışmak risklidir.
- Bunun yerine uygulamanızı bu sınıra ulaşmayacak şekilde tasarlamanız daha kolaydır.
Evented sunucular
- Evented sunucular genelde CPU çekirdeği başına yalnızca bir thread kullanırlar.
- Tüm olay threadlerin asla bloklanmayacakları üzerine kuruludur. Tüm I/O asenkrondur.
- Böylece thread boş beklemek yerine diğer istekleri işleyebilir
- I/O cevabı hazır olduğunda tekrar geri dönebilir.
Non-blocking Javascript kodu
var callback = function(data) {
console.log("Callback fired with: " + data);
};
$.get('/example', callback);
// Bu satır çalıştığında uzak servis çağrısıdan büyük ihtimalle henüz cevap dönmemiş olacak.
console.log('Bu satır callbackten önce çalışabilir!');
Play Framework ile async örneği
- Cloud ile birlikte tipik bir uygulama pek çok uzak servis çağrısı yapmak durumunda kalıyor.
object ProxyController extends Controller {
def proxy = Action {
val responseFuture: Future[Response] = WS.url("http://example.com").get()
val resultFuture: Future[Result] = responseFuture.map { resp =>
Status(resp.status)(resp.body).as(resp.ahcResponse.getContentType)
}
Async(resultFuture)
}
}
Play Framework ile async örneği
// Paralel 3 adet servis çağrısı yapılıyor.
val fooFuture = WS.url("http://foo.com").get()
val barFuture = WS.url("http://bar.com").get()
val bazFuture = WS.url("http://baz.com").get()
for {
foo <- fooFuture
bar <- barFuture
baz <- bazFuture
} yield {
Ok(...)
}
Türkiye'de Scala Kullanımı
Dünya Scala ve Play Kullanımı
Scala @ VNGRS - Bookish.com
- Neden Scala kullanmaya başladık
- Scala Developer Bulmak
- Scala Geliştirici Arıyoruz !!!
- deniz@vngrs.com
Ekip
- Çağdaş Şenol(Bilgi CS) - friendfeed.com/csenol
- Fehmi Can Sağlam(4Primes) - @fehmicansaglam
- Volkan Yazıcı(Özyeğin CS) - @yazicivo
- Erdem Ağaoğlu(Nokta) - @agaoglu
- M.Deniz Oktar(VNGRS) - @denizoktar