Forum: Duyurular RSS
DConf 2015 canlı yayını
Sayfa:  önceki  1  2 
acehreli (Moderatör) #16
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj ID 11152
Gün 1 - Mayıs 27, Liran Zvebel, "Using D for Implementing a Large Scale Primary Storage System"

Liran, D'den nasıl yararlandıklarını anlatıyor. Weka.io bir İsrail firması; 20 kişilik startup firmalarında çoğu programcı D kullanıyor. İşleri, büyük ölçekli veri saklama (storage system). Kesintisiz hizmet vermek zorundalar ve çok hızlı olmaları gerekiyor.

120K satırlık D kodları var.

Kullandıkları dilin etkin olması şartmış ve büyük boyutlu projeye uygun olması gerekliymiş. Sunucuları birden fazla coğrafi noktada bulunuyor.

Daha önceden şunu yapıyorlarmış: C dili. XML'e dayalı kod üretiyorlar.

Ürünün yönetimi Python ile yapılıyormuş. Python'un küçük projelere uygun olduğunu farketmişler. Proje büyüyünce sorunlar başlamış. Hele, veri saklama gibi bir konuda Python'un teste uygun olmadığını görmüşler.

Şimdi yalnızca D kullanıyorlar. Herşey kullanıcı ortamı programı (user space). Çok az kernel modülleri de var.

Fiber ve 'reactor' tasarımları kullanıyorlar.

Bellek kullanımı konusunda çok hassas olmak zorundalar. Bir kere veri gelmişse, kesinlikle başka bir yere taşınmıyor veya kopyalanmıyor. Herşey çok hızlı ve gecikme (latency) yok. Dolayısıyla, veriyle ilgili kodlarda çöp toplayıcı kullanılmıyor.

Hata ayıklama olayı böyle bir sistemde çok zor oluyor çünkü loglamaya kalksanız çok kısa sürede log dosyaları doluyor. Hatanın oluşmasını bekleseniz geç kalmış oluyorsunuz.

Hata açıklayıcı kullanamıyoruz, dosyaya loglayamıyoruz, vs.

Trace (izleme) konusunda D'den yararlanmışlar. @notrace gibi bir kullanıcı niteliği ile bazı işlevleri hiç izlemiyorlar bile. Loglamayı çok etkin hale getirmişler.

Herşey çok hızlı gerçekleşiyor ve sihir gibi hallediliveriyor. :)

Hata oluşuyor, trace sistemimiz bilgiyi veriyor, programcı hatayı gideriyor.

(Sürekli olarak hızdan (efficiency) bahsediyor.)

Program çalışırken onunla etkileşen başka bir program sayesinde programcı programın çalışmasını izleyebiliyor. Her tür bilgiyi alabiliyorlar.

Programcı grubumuz yıllarca tekrar tekrar RPC sistemleri yazmışızdır. Otomatik olarak kod üretiyoruz, sync/async, vs. hep otomatik halledilmiş oluyor.

D'nin bir özelliğinden çok yararlanıyoruz (static foreach).

Fiberlerden çok yararlanıyoruz.

Veri yapılarımız çöp toplayıcı kullanmıyor.

Typedef çok yararlı bir olanak! Umarım siz de projelerinizde yararlanıyorsunuzdur...

Bu konuşmayı dinleyen büyük firmalar varsa, hepinize D'den yararlanmanızı öneririm. Bana D'yi öneren Kent Beck olmuştu. Size mesajım şudur: D harika.

Başka bir yararı, C++'ı gösterdiğimiz programcılar kısa kodları bile anlayamayabiliyorlar. D'yi gösterdiğimizde ise çok okunaklı ve anlaması kolay oluyor.

Şimdi de sorunlara geçelim...

Çöp toplayıcı. Sürekli olarak çalışması ve gecikmesinin (latency) olmaması gereken programlar çöp toplayıcı kullanamazlar. 1 milisaniyeden fazla duraksayamayız. Standart kütüphane çöp toplayıcıyı kullandığımızı varsaydığından standart kütüphaneyi de kullanamıyoruz.

Eşleme tablosu, dinamik dizi, map, filter, vs. kullanamıyoruz.

İkinci sorunumuz, derleme: Bütün projeyi birden derlemek olanaksız çünkü dmd 30G bellek kullanıyor ve çok uzun sürüyor. dmd işlemcinin tek çekirdeğinde işliyor.

C++ bu konuda daha iyi çünkü ccache gibi çözümler kullanılabiliyor. D için henüz böyle bir şey yok.

400 dosyamız var. Birisine dokunduğumuzda yaklaşık olarak 200 dosyanın baştan derlenmesi gerekiyor. Çok büyük projelerin desteklenmesi isteniyorsa D'nin bu konuyu çözmesi gerek.

Diğer derleyiciler: gdc bizim kodumuzu doğru derlemiyor. (Fiber vs. konuları.)

ldc bizim kodu derlerken kendisi göçüyor.

Bu yüzden dmd kullanmak zorundayız.

(Andrei bu noktada soruyor:) Package'lardan yararlandınız mı? Derleme konusunda yararı olabilir... Liran yanıtlıyor: Package'ları da düşünmüştük ama henüz denemedik.

(Walter soruyor:) .di dosyalarından yararlanıyor musunuz? Liran'ın yanıtı: Hayır.

dmd'nin ürettiği assembly hızlı değil. Yakında gdc konusunu çözmeyi umuyoruz.

Başka bir sorun, tamsayıların kullanış olabilmeleri:

int'ten küçük tamsayılarla çalışırken kod hoş olmuyor. Örneğin, hep tür dönüşümü yapmak zorunda kalıyoruz çünkü ara işlemler hep 'int' türünde oluyor. (Ali'nin notu: Bu, C'den gelen bir davranıştır.)

(Andrei araya giriyor ve tamsayı durumunun neden böyle olduğunu açıklıyor:) 1) C kodunu kopyaladığımızda ya doğru işlemeli ya da hiç derlenmemeli. 2) Her ne kadar mantıksız durumlar olsa da, şimdiki dönüşüm kuralları basit; karmaşıklaştırmak daha kötü olurdu. O yüzden bu konuda değişiklik beklememeliyiz.

(Walter da ekliyor:) Bu durum geçmişte çok tartışıldı. Neyse ki 'value range propagation' olanağımız var ve sonucun örneğin ushort'a sığacağının garantili olduğu durumlarda cast'e gerek kalmıyor. Evet, 'value range propagation'ı geliştirebiliriz.

Özet:

Bir seneden uzun bir süredir D kullanıyoruz.

Çoğu programcımız D'yi çok seviyorlar. Yaptığımız herşey şablon... C++'ta bunu yapmak çok zor olurdu. Ya hataya düşerdiniz ya da kodunuzu bir kaç ay sonra bile anlayamazdınız.

D'yi kullanabilmek için çok altyapı geliştirdik. Meyvalarının yeni yeni almaya başladık.

Kötü taraf: Bizimki kadar büyük bir proje yavaş derleniyor.

Yazdığımız bazı kodları açabiliriz. Güçlü D programcılarıyla çalışmaya açığız. Bizim bulduğumuz çözümler camiaya sunulabilir.

Ali
zafer #17
Üye Tem 2009 tarihinden beri · 700 mesaj · Konum: Ankara
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj ID 11152
acehreli on 2015-05-30, 09:54:
Özetle, Andrei şunları söyledi:

  • Belirli bir algoritmanın UzunlukBilgisiVeren_ElemanlarıReferansOlan_ForwardRange gerektirdiğini söylemek yerine, 'static if'ten ve derleme zamanında mantıksal ifadelerden yararlanarak duruma göre davranmalıyız.

Tabii bunların hepsini de bitirmeye çalıştığı std. allocator'daki deneyimleri üzerine söyledi.

Doğrusunu söylemek gerekirse hiç bir şey anlamadım :) Sanırım C++ dünyasına oldukça uzak olduğum için bu konuşmaların arkasında yatan sebepleri çok anlamıyorum. Örneğin şu static if meselesinin neden bu kadar üzerinde durulduğunu anlamıyorum. Doğrusu ben D'yi sadece D olduğu için seven birisiyim.


acehreli on 2015-05-30, 09:54:
Kızım liseyi bitirdi. Oğlumun okula gitmesine de bir kaç sene var. Dolayısıyla, yaz ayları dışında da Türkiye'ye gelebileceğim. Yani, seneye Berlin'de görüşürüz! :D

Umarım, tüm çabalarım bu yönde.


acehreli on 2015-05-30, 09:54:
İkinci sorunumuz, derleme: Bütün projeyi birden derlemek olanaksız çünkü dmd 30G bellek kullanıyor ve çok uzun sürüyor. dmd
işlemcinin tek çekirdeğinde işliyor.

Bu konu benide üzüyor. Evdeki 2GB belleğe sahip Windows(32bit) bilgisayarımda basit bir vibe.d projesini derleyemiyorum. Çünkü işlem bitmeden bellek bitti hatası alıyorum :(
https://github.com/zafer06 - depo
acehreli (Moderatör) #18
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Kayıtlarda konuşmaların başladığı noktaları belirlemişler:

  http://forum.dlang.org/thread/sujyaurgyfumoiimixmx@forum.d…

Bağlantılarda iki hata varmış; düzeltiyorum:

Day 1:
Brian Schott: https://youtu.be/ep5vDQq15as
Liran Zvibel: https://youtu.be/-OCl-jWyT9E?t=3720
David Nadlinger: https://youtu.be/-OCl-jWyT9E?t=7251
Amaury Sechet: https://youtu.be/-OCl-jWyT9E?t=10189
Walter & Andrei AUA: https://youtu.be/-OCl-jWyT9E?t=14477

Day 2:
Chuck Allison: https://youtu.be/AH35IxWkx8M?t=182
Lightening Talks:
    Jonathan Crapuchettes: https://youtu.be/AH35IxWkx8M?t=4088
    Adam Ruppe: https://youtu.be/AH35IxWkx8M?t=4477
    Lionello Lunesu: https://youtu.be/AH35IxWkx8M?t=4929
    Erik Smith: https://youtu.be/AH35IxWkx8M?t=5357
    Walter Bright: https://youtu.be/AH35IxWkx8M?t=5896
Mihails Strasuns https://youtu.be/AH35IxWkx8M?t=8031
Andy Smith: https://youtu.be/AH35IxWkx8M?t=15825
Jonathan Davis: https://youtu.be/AH35IxWkx8M?t=19410
Mark Isaacson: https://youtu.be/AH35IxWkx8M?t=23056
Andrei Alexandrescu: https://youtu.be/AH35IxWkx8M?t=23056
Open Mic / Q+A: https://youtu.be/AH35IxWkx8M?t=27449

Day 3:
Andrei Alexandrescu: https://youtu.be/oA1exjdEIWw?t=44
Adam Ruppe: https://youtu.be/oA1exjdEIWw?t=4350
Joseph Wakeling: https://youtu.be/oA1exjdEIWw?t=7617
John Colvin: https://youtu.be/oA1exjdEIWw?t=12105
Atila Neves: https://youtu.be/oA1exjdEIWw?t=16190
Erich Gubler: https://youtu.be/oA1exjdEIWw?t=19178

Ali
acehreli (Moderatör) #19
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #17
zafer:
static if meselesinin

Aslında çok basit bir konu ama dediğin gibi, gerekler ancak işin içine girmeye başladıkça görülüyor. Başka hangi dillerde bunun gibi bir olanak olduğu sorulmuş ve C++ üzerine güzel bir örnek verilmiş. Bir algoritma tamsayılara veya kesirli sayılara göre örneğin daha hızlı veya daha doğru sonuç verecek biçimde farklı gerçekleştirilebiliyor olabilir:

  http://stackoverflow.com/questions/1717976/are-there-other…

Burada da bulunsun diye, bir de aralıklardaki yararını hatırlayalım. Eleman değerlerini çarpan bir aralığımız olsun (not, bu işlemi map!(a => a * 2) diye de gerçekleştirebiliriz):
import std.range;
import std.algorithm;
 
/* Elemanları belirli bir sayıyla çarpar. (Basit olsun diye, çarpan
 * değeri 'int' yapalım.) */
struct Çarpıcı(R)
    if (isInputRange!R)
{
    R aralık;
    int değer;
 
    @property bool empty() const
    {
        return aralık.empty;
    }
 
    @property auto front() const
    {
        return aralık.front * değer;
    }
 
    void popFront()
    {
        aralık.popFront();
    }
}
 
auto çarp(R)(R aralık, int değer)
{
    return Çarpıcı!R(aralık, değer);
}
 
void main()
{
    auto dizi = [ 1, 2, 3 ];
 
    assert(dizi.çarp(10).equal([ 10, 20, 30 ]));
}
Amacımıza ulaştık: Zincirleme aralık işlemlerinin arasına istediğimiz noktaya .çarp(a) gibi bir ifade yerleştirebiliyoruz.

Ancak, aşağıdaki gibi indeksleyemeyiz çünkü opIndex'i tanımlamadık çünkü bunu ancak RandomAccessRange aralıkları sağlayabilir:
    auto çarpılan = dizi.çarp(10);
    assert(çarpılan[1] == 20);    // <-- DERLEME HATASI
// Error: no [] operator overload for type Çarpıcı!(int[]) 

static if'in yararı burada görülüyor: Eğer R bir ForwardRange ise save() de tanımlayabiliriz ve eğer bir RandomAccessRange ise opIndex() de tanımlayabiliriz:
struct Çarpıcı(R)
    if (isInputRange!R)
{
// ...
 
    static if (isForwardRange!R) {
        auto save()
        {
            return aralık.save;
        }
    }
 
    static if (isRandomAccessRange!R)
    {
        auto opIndex(size_t i)
        {
            return aralık[i] * değer;
        }
    }
 
    // Benzer biçimde, hasLength, vs.'ye göre başka işlevler de eklenebilir
}

Çok kolay.

Not: Geçen gün bu işlemleri tanımlamanın çok daha kolay bir yolunu farkettim. alias this burada da kullanılabiliyor ve biz yalnızca değiştirdiğimiz işlevleri tanımlamakla yetiniyoruz:
struct Çarpıcı(R)
    if (isInputRange!R)
{
    R aralık;
    int değer;
 
    // Doğrudan aralık'a iletilen işlemler bunun tarafından zaten hallediliyor:
    alias aralık this;
 
    @property auto front() const
    {
        return aralık.front * değer;
    }
 
    static if (isRandomAccessRange!R)
    {
        auto opIndex(size_t i)
        {
            return aralık[i] * değer;
        }
    }
}

basit bir vibe.d projesini derleyemiyorum. Çünkü işlem bitmeden bellek bitti hatası alıyorum :(

Şimdi baktım: --build-mode=singleFile seçeneği ile daha az bellek kullanılıyormuş (ama daha uzun sürüyormuş). Ne yazık ki şuradaki kişiye yaramamış:
http://forum.rejectedsoftware.com/groups/rejectedsoftware.…

Ali
zafer #20
Üye Tem 2009 tarihinden beri · 700 mesaj · Konum: Ankara
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Esas başlığın dışına çıkmamak adına bence son mesajdan itibaren yeni bir konu açmalıyız yada bunu taşımalıyız.

Örnek çok güzel ve kullanılan tekniklerde öyle, doğrusu aralıklar ve opIndex gibi konularda çok tecrübem yok, benim için merakla incelenecek güzel bir kod bloğu.

dizi.çarp(10).equal([ 10, 20, 30 ])

Mesela yukarıdaki kod aslında çarp(dizi, 10); şeklinde olabiliyor sanırım? Konuya çok hakim olmayanlar için ilk yazım biraz kafa karıştırıcı.
https://github.com/zafer06 - depo
acehreli (Moderatör) #21
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Öylesine yazmakta olduğum bir kodda yine karşılaştım: Kullanılan aralığın .length niteliği varsa, yani kaç eleman geleceğini biliyorsak, onları yazacağımız dizi de baştan yer ayırabiliriz:
    static if (hasLength!R) {
        arr.reserve = source.length;
    }
zafer:
dizi.çarp(10).equal([ 10, 20, 30 ])

Mesela yukarıdaki kod aslında çarp(dizi, 10); şeklinde olabiliyor sanırım?
Evet, o kod İşlev Çağırma Ortak Söz Dizimi (UFCS) olanağından yararlanıyor: http://ddili.org/ders/d/ufcs.html
Konuya çok hakim olmayanlar için ilk yazım biraz kafa karıştırıcı.
Ne yazık ki öyle ama yararını anlayınca vazgeçilemiyor. :) Yukarıdaki bağlantıda da gösterildiği gibi, önceden alıştığımız gibi yazarsak çarpılan değer ve çarp ve neye eşit olacağı ile equal birbirlerinde uzak düşüyorlar:
equal(çarp(dizi, 10), [ 10, 20, 30 ])
Bu yeni yazdığım daha okunaksız çünkü içeriden dışarıya doğru okumamız gerekiyor. Yukarıdaki zincirleme olan ise soldan sağa: dizi ile başla, şu değerle çarp, şu değerle karşılaştır.

Ali
Avatar
Salih Dinçer #22
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Geç oldu ama "hoş geldin Zafer", seni burda görnek güzel...:)
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
zafer #23
Üye Tem 2009 tarihinden beri · 700 mesaj · Konum: Ankara
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Salih Dinçer on 2015-07-10, 17:44:
Geç oldu ama "hoş geldin Zafer", seni burda görnek güzel...:)

Teşekkürler Salih, güzel dostların sesini duymakta çok güzel ;)
https://github.com/zafer06 - depo
Doğrulama Kodu: VeriCode Lütfen resimde gördüğünüz doğrulama kodunu girin:
İfadeler: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O
Özel Karakterler:
Sayfa:  önceki  1  2 
Forum: Duyurular RSS
Bağlı değilsiniz. · Şifremi unuttum · ÜYELİK
This board is powered by the Unclassified NewsBoard software, 20100516-dev, © 2003-10 by Yves Goergen
Şu an: 2017-11-21, 11:15:50 (UTC -08:00)