Thread overview
Vibe.d, bir web programlama çatısı
Apr 28, 2012
Ronin
Feb 03, 2013
Salih Dinçer
April 27, 2012

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

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

April 28, 2012

Oha! desem ayıp etmiş olur muyum. Helal olsun.

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

February 02, 2013

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

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

February 03, 2013

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ş.

Alıntı:

>

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

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

February 02, 2013

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

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

February 03, 2013

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?

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

February 03, 2013

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

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

February 03, 2013

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

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

February 03, 2013

'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

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]