Forum: Duyurular RSS
Vibe.d, bir web programlama çatısı
acehreli (Moderatör) #1
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ı
Konu adı: Vibe.d, bir web programlama çatısı
Duyurusu:

  http://forum.dlang.org/post/jncc7h$3161$1@digitalmars.com

Kendi sitesi de bu çatı ile yazılmış:

  http://vibed.org/

Henüz denemedim ama olanaklarına ve aldığı tepkilere bakılırsa çok başarılı.

Ali
Avatar
Ronin #2
Üye Nis 2011 tarihinden beri · 39 mesaj · Konum: Ankara
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Oha! desem ayıp etmiş olur muyum. Helal olsun.
Adaletli olmak zor iş.
acehreli (Moderatör) #3
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ı
Bizim firmada REST arayüzü kullanan programlar düşünülmeye başlandı. Ben de vibe.d'yi ilk defa deneme bahanesi bulmuş oldum. :)

Bilmeyenler için; REST, HTTP protokolünün de kullanmakta olduğu dört birimden oluşan arayüz kavramı: GET, PUT, POST, DELETE. Yani sistemdeki her program aynı bilgisayar üzerinde bile olsalar birer web sunucusu gibi çalışıyorlar.

Tabii Python gibi diller ve kütüphaneleri web servisleri konusunda çok ilerlemiş durumdalar. Buna rağmen Python'un GIL (global interpreter lock) sorunu ve yavaşlığı tabii ki düşündürücü. Karşılaştırıldığında, vibe.d bu konularda süper bir çözüm olmuş.

Ama büyük olasılıkla biz yine de önce Python veya başka bir dilin teknolojileri ile başlayacağız. REST'in güzelliği, herhangi bir program yavaş veya başka bir nedenle yetersiz kalırsa o zaman aynısı başka bir dille yazılabilir ve aynı REST arayüzünü sunduğu sürece sorunsuzca diğerinin yerine kullanılabilir.

Neyse... Özetle, vibe.d müthiş! :)

Ali
Avatar
zekeriyadurmus #4
Kullanıcı başlığı: Talha Zekeriya Durmuş
Üye Eki 2012 tarihinden beri · 701 mesaj · Konum: Samsun/Türkiye
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Vibe.d yi bir kaç kere kurmaya çalıştım ve beceremedim :P arsd.cgi kullandım ama yeterli olduğunu söyleyemem açıkcası. Tango ile yapılmış bir cgi uygulamasını denedim mango kurulumunu beceremedim :D

Sanırım Vibe.d çalışmama sebebi dmd sürüm farklılıkları. Ben şu an v2.061 kullanıyorum ama vibe ne kullanıyor bir bilgim yok.

Ali hocam siz dmd nin hangi sürümünü kullanıyorsunuz?

Zekeriya
Bilgi meraktan gelir...
acehreli (Moderatör) #5
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ı
vibe.d 2.061 ile çalışıyor. (Sitesinde de öyle diyor.)

Kurarken iki kütüphaneyi kurmam ve indirmem gerekti:

  • openssl'in geliştirme dosyaları (vibe belgelerinde hangi sürümüyse)

  • libevent2'nin geliştirme dosyaları

Benim için sorunlu olan ikincisiydi çünkü kullandığım Linux dağıtımı libevent1 küsur kullanıyor. O yüzden libevent2'yi kaynak dosyalarını indirip kendim oluşturdum: configure, make, make install üçlü komutuyla bir kaç saniyede oluştu. Ama sonra LD_LIBRARY_PATH ortam değişkeni ile libevent2'nin kütüphanesinin yerini ekledim:

export LD_LIBRARY_PATH=/home/acehreli/libevent_2/libevent-2.0.21-stable/.libs

Bir vibe programı oluşturmak için:

vibe init deneme

Ondan sonra vibe programlarını çalıştırmak kolay: app.d'nin bulunduğu yere gidip vibe yazmak gerekiyor:

cd deneme/source
vibe


Aslında şurada daha basit kurma yöntemi de var:

  http://vibed.org/docs

Ali
Avatar
zekeriyadurmus #6
Kullanıcı başlığı: Talha Zekeriya Durmuş
Üye Eki 2012 tarihinden beri · 701 mesaj · Konum: Samsun/Türkiye
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Aslında vibe.d çalışıyormuş ama benim test ettiğim örnek "rest" ile ilgili bir sorun varmış. HTTP server örneği çalışıyor.

Ve windows kurulumu çok kolaymış :D sadece rarı bir yere çıkartıp bin klasörünün adresini path a eklemek yeterliymiş.

Bir vibe programı oluşturmak için:

vibe init deneme

Ondan sonra vibe programlarını çalıştırmak kolay: app.d'nin bulunduğu yere gidip vibe yazmak gerekiyor:

cd deneme/source
vibe

bunu bilmiyordum. Ve vibe ile çalıştırınca kafama takılmıştı VisualD üzerinde nasıl çalışacak diye ama bunu dert etmeme gerek kalmadı artık :)

Zekeriya
Bilgi meraktan gelir...
acehreli (Moderatör) #7
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ı
Python'un GIL'i üzerinde konuşulunca bunun D'de nasıl sorun oluşturmadığını iki örnekle gösterdim. Biri std.parallelism'i diğeri de std.concurrency'yi kullanıyor.

Programlar req.query yoluyla URL parametrelerinin nasıl sorgulandıklarını da gösteriyorlar. Kullanmak için örneğin http://127.0.0.1:8080/work?count=5 isteği gönderiliyor.

import vibe.d;
import std.parallelism;
import std.range;
import std.math;
 
void pi(HttpServerRequest req, HttpServerResponse res)
{
    // Example adapted from http://dlang.org/phobos/std_parallelism.html
    auto param = ("terms" in req.query);
    immutable n = (param && !empty(*param))
                  ? to!size_t(*param)
                  : 1_000_000_000;
 
    immutable delta = 1.0 / n;
 
    double getTerm(size_t i) {
        immutable x = (i - 0.5) * delta;
        return delta / (1.0 + x * x);
    }
 
    auto terms = map!getTerm(iota(n));
    auto pi = 4.0 * taskPool.reduce!"a + b"(terms);
 
    res.writeJsonBody([ "pi" : pi ]);
}
 
void logarithms(HttpServerRequest req, HttpServerResponse res)
{
    // This example is adapted from
    // http://dlang.org/phobos/std_parallelism.html
 
    // Find the logarithm of every number from 1 to
    // 100_000_000 in parallel.
    auto logs = new double[100_000_000];
 
    // Parallel foreach works with or without an index
    // variable.  It can be iterate by ref if range.front
    // returns by ref.
 
    // Iterate over logs using work units of size 100.
    foreach(i, ref elem; parallel(logs, 100)) {
        elem = log(i + 1.0);
    }
 
    // Note how Ali is cheating by "slicing" the result to return only the
    // first 1000 of the logarithms.
    res.writeJsonBody([ "logs" : logs[0 .. 1000]]);
}
 
static this()
{
    auto router = new UrlRouter;
    router.get("/pi", &pi);
    router.get("/log", &logarithms);
 
    auto settings = new HttpServerSettings;
    settings.port = 8080;
 
    listenHttp(settings, router);
}

import vibe.d;
import std.array;
import std.parallelism;
import std.concurrency;
 
void worker(Tid owner, string work)
{
    // Slowed down artifically
    sleep(100.msecs);
    owner.send(format("%s is ready", work));
}
 
void employWorkers(HttpServerRequest req, HttpServerResponse res)
{
    auto param = ("count" in req.query);
    size_t totalWorkers = (param && !empty(*param))
                          ? to!size_t(*param)
                          : totalCPUs;
 
    // Start the workers
    foreach (i; 0 .. totalWorkers) {
        spawn(&worker, thisTid, format("work %s", i));
    }
 
    // Collect the results
    string[] results;
 
    foreach (i; 0 .. totalWorkers) {
        auto result = receiveOnly!string();
        results ~= result;
    }
 
    res.writeJsonBody([ "results" : results ]);
}
 
static this()
{
    auto router = new UrlRouter;
    router.get("/work", &employWorkers);
 
    auto settings = new HttpServerSettings;
    settings.port = 8080;
 
    listenHttp(settings, router);
}

Ali
Avatar
Salih Dinçer #8
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Bu konu beni epey aşıyor ama girmeye gönüllü olduğumu ifade etmeliyim...

Anladığım kadarıyla, bizim göremediğimiz vibe.d'nin bir main()'i var ve this() ile başlayarak kodu işletiyor; öyle mi?
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
acehreli (Moderatör) #9
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ı
'static this()' global değişkenler için main'den önce işletilir. Evet, sunucu o sırada başlatılıyor.

Bu konu beni de aşıyor ama hangi isteğe karşılık hangi işlevin başlatılacağının basitçe tanımlanması hoş:

    router.get("/work", &employWorkers);

Artık http://127.0.0.1:8080/work isteği geldiğinde employWorkers işlevi çalışıyor ve bu örnekte sonucu bir JSON nesnesi olarak döndürüyor.

Ali
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:
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-19, 05:53:42 (UTC -08:00)