Forum: D Programlama Dili RSS
Bir CGI programı örneği
Sayfa:  1  2  sonraki 
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ı: Bir CGI programı örneği
D'nin özellikle web programlamaya yönelik olduğu söylenemez. Ama ortam değişkenlerine erişebilen ve çıkışına web sayfası içeriğini yazdırabilen her dilde olduğu gibi, onunla da CGI programlama yapılabilir.

Bir örnek:

  http://ddili.org/cgi-bin/deneme

Ali
canalpay (Moderatör) #2
Kullanıcı başlığı: Can Alpay Çiftçi
Üye Tem 2009 tarihinden beri · 1133 mesaj · Konum: İzmir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Bende sizin örneğinizi çalıştırmayı başardım ve hayatımda ilk defa cgi programı derlemiş oldum.

Şuanda D ile nasıl web programlanır çok merak etmekteyim :-) Siz web programlama için hangi modüllerin bilinmesi gerektiğini düşünüyorsunuz ?

Birde Mysql'e erişebildim mi çok iyi olacak.(Yok DKVde yeter :-) )
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ı
Belki başkaları görmemiştir diye, o programın koduna, sayfanın altından bağlanılabiliyor. Yani şu:

  http://ddili.org/ornek_kod/deneme.d

canalpay:
Şuanda D ile nasıl web programlanır çok merak etmekteyim :-)

Bu konuda çok bilgi bulunur herhalde ama cgi web programları kısaca şu şekilde çalışır:

Web sunucuları, örneğin Apache, bizim main'imizi çağırmadan önce, web sitesinin kullanıcıdan aldığı bilgileri ortam değişkenlerine (environment variables) atar. Çok standart olan değişkenler şunlardır:

string[] ortamDeğişkenleri =
[
    "SERVER_SOFTWARE",
    "SERVER_NAME",
    "GATEWAY_INTERFACE",
    "SERVER_PROTOCOL",
    "SERVER_PORT",
    "REQUEST_METHOD",
    "PATH_INFO",
    "PATH_TRANSLATED",
    "SCRIPT_NAME",
    "QUERY_STRING",
    "REMOTE_HOST",
    "REMOTE_ADDR",
    "AUTH_TYPE",
    "REMOTE_USER",
    "REMOTE_IDENT",
    "CONTENT_TYPE",
    "CONTENT_LENGTH",
    "HTTP_ACCEPT",
    "HTTP_USER_AGENT",
];

(Başka sunucular başka değişkenler de tanımlıyor olabilir. Ama yukarıdakiler oldukça standart.)

Yukarıdaki web programında bir düğmeye basınca anlaşıldığı gibi, kullanıcının girdiği bilgiler, programa QUERY_STRING ortam değişkeninin değeri olarak geliyor.

Ortam değişkenlerine std.process modülündeki getenv ile erişiliyor.

cgi programı, giriş bilgisini aldıktan sonra, web sunucusunun tekrar kullanıcıya göstereceği HTML çıktısını kendi standart çıkışına gönderir.

Eğer bilgisayarında bir web sunucusu (örneğin Apache) çalışıyorsa, tarayıcını localhost'a (veya 127.0.0.1 adresine) yönlendir.

Programını, onun cgi programlarının başlatılmasına izin verilen bir klasörüne de koymuş olman gerekir. Örneğin ddili.org'daki o 'deneme' programı şurada duruyor: /public_html/cgi-bin

Web sunucusu ayarlamak başlı başına bir konu, ben daha fazla ayrıntıya giremeyeceğim. :/

Ali
acehreli (Moderatör) #4
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ı
Bu işi kolaylaştıran kütüphaneler de olmalı. dsource proje sayfasında, açıklamasında 'web' geçen projeler var. Hiçbirisine bakmadım... :)

Ali
canalpay (Moderatör) #5
Kullanıcı başlığı: Can Alpay Çiftçi
Üye Tem 2009 tarihinden beri · 1133 mesaj · Konum: İzmir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Bu konuda çok bilgi bulunur herhalde ama cgi web programları kısaca şu şekilde çalışır:

Teşekkürler ama çalıştırdığım için zaten çoğunu biliyorum :-)

Eminim yakında düzgün bir web framework'ü çıkar.(D 2 için bahsediyorum. ) (Belkide ilerideki projelerimizden biri olur :-) )
canalpay (Moderatör) #6
Kullanıcı başlığı: Can Alpay Çiftçi
Üye Tem 2009 tarihinden beri · 1133 mesaj · Konum: İzmir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Ortam değişkenlerinin tamamını bulabileceğimiz bir adres biliyor musunuz? Örneği post olarak gönderilmiş veri nasıl çekilir ?

Birde form bilgisini get yöntemi ile çekince Türkçe karakterleri çekmiyor. Sorun nereden kaynaklanıyor olabilir. Post yöntemi ile çekersem yine Türkçe karakter sorunu yaşar mıyım ?

Sizinde cgi hakkında pek bilginiz olmadığını(Benden çok ama :-) ) biliyorum. Ama yinede Türkçe karakter sıkıntısına çok bozuldum. Bir soyadımı giremeyecek miyim :-( Post ile bu sorunu yaşamam sanıyorum.(Get ile de ilgili bir ayar vardır. ) Bazı sitelerde perl'ü ile cgi nasıl programlanıyor anlatıyor. Onlara da bakarsam ve o yazanları D diline çevirirsem bir şeyler öğrenirim.
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ı
Aslında karakterler var ama değişik bir düzendeler. Örneğin "düğme" sözcüğü QUERY_STRING içinde "d%C3%BC%C4%9Fme" şeklinde geliyor.

Eğer CGI programları konusunda yardım eden bir kütüphane kullanılmayacaksa, o dönüşümün bizim tarafımızdan yapılması gerekiyor.

CGI programı en başta

dout.writef("Content-type: text/html; charset=utf-8\n\n");

dediği için, "%C3%B3"ün 'ü'nün UTF-8 hali olduğunu düşünebiliriz.

import std.cstream;
import std.process;
import std.conv;
 
int onaltılıKod(char kar)
{
    if (kar >= '0' && kar <= '9') {
        return kar - '0';
    } else {
        return 10 + kar - 'A';
    }
}
 
string dönüştür(string giriş)
{
    ubyte[] sonuç;
 
    int i;
 
    while (i < giriş.length) {
        if (giriş[i] == '%') {
            ++i;
            int karakterKodu = onaltılıKod(giriş[i]) * 16 + onaltılıKod(giriş[i + 1]);
            sonuç ~= cast(ubyte)karakterKodu;
            i += 2;
        } else {
            sonuç ~= giriş[i];
            ++i;
        }
    }
 
    return cast(string)sonuç;
}
 
void main()
{
    string değer = dönüştür(getenv("QUERY_STRING"));
    dout.writefln(değer);
}

O programı denemek için web sunucusuna ihtiyacın yok. Giriş ortam değişkeni olduğu için, komut satırından da deneyebilirsin:

export QUERY_STRING="hayvan=at&derece=Orta&sevilen+hayvan=&birinci+d%C3%BC%C4%9Fme=Bir+D%C3%BC%C4%9Fme"
./deneme

Çıktısı:

hayvan=at&derece=Orta&sevilen+hayvan=&birinci+düğme=Bir+Düğme

Ali
acehreli (Moderatör) #8
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ı
Biraz değiştirdim ve sözleşmeli programlama denetimlerini de ekledim:

import std.cstream;
import std.process;
import std.conv;
 
int onaltılıKod(in char kar)
in
{
    assert(((kar >= '0') && (kar <= '9'))
           ||
           ((kar >= 'A') && (kar <= 'F')));
}
out(sonuç)
{
    assert((sonuç >= 0) && (sonuç <= 15));
}
body
{
    const int kod = (kar >= '0' && kar <= '9')
                    ? kar - '0'
                    : 10 + kar - 'A';
    return kod;
}
unittest
{
    assert(onaltılıKod('1') == 1);
    assert(onaltılıKod('C') == 12);
}
 
char yüzdeliyiKarakterOlarak(string giriş)
in
{
    assert(giriş.length == 3);
    assert(giriş[0] == '%');
}
body
{
    const int kod = onaltılıKod(giriş[1]) * 16 +
                    onaltılıKod(giriş[2]);
    return cast(char)kod;
}
unittest
{
    assert(yüzdeliyiKarakterOlarak("%8A") == '\x8a');
    assert(yüzdeliyiKarakterOlarak("%20") == ' ');
}
 
string cgiDizgiDönüştür(string giriş)
{
    string sonuç;
 
    int i;
 
    while (i < giriş.length) {
        if (giriş[i] == '%') {
            // Sonunda yer olmalı
            assert(giriş.length - i >= 3);
 
            sonuç ~= yüzdeliyiKarakterOlarak(giriş[i .. i + 3]);
            i += 3;
        } else {
            sonuç ~= giriş[i];
            ++i;
        }
    }
 
    return sonuç;
}
unittest
{
    assert(cgiDizgiDönüştür("a%20b%DDc") == "a\x20b\xddc");
    assert(cgiDizgiDönüştür("%25") == "%");
}
 
void main()
{
    string değer = cgiDizgiDönüştür(getenv("QUERY_STRING"));
    dout.writefln(değer);
}

Ali
Mengu (Moderatör) #9
Kullanıcı başlığı: NONSERVIAM
Üye Tem 2009 tarihinden beri · 347 mesaj · Konum: Dersaadet
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
hadi d ile web framework yazalim :)
http://www.mengu.net - some kind of monster
acehreli (Moderatör) #10
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ı
Daha dün tekrar aklıma geldi. :)

trileri'yi deneme amaçlı olarak siteye koyayım dedim ama HTML çıktısını elle yazmak istemediğim için vazgeçtim.

Ali
canalpay (Moderatör) #11
Kullanıcı başlığı: Can Alpay Çiftçi
Üye Tem 2009 tarihinden beri · 1133 mesaj · Konum: İzmir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
hadi d ile web framework yazalim :)

Aynısını bende dedim. Ama şuanki işlerimiz çok :) Ayrıca şu dkv'yi  bitirtmeden hiç bir şey yaptırtmam. Yoksa siz kendi veritabanınızı mı yapcaksınız yada mysql'i filan D'yemi iliştirceksiniz. :)
 

Ama dkv'yi bitirdikten sonra web framework için en azından en dandiğinden bir depolama sistemimiz olacak :)
Mengu (Moderatör) #12
Kullanıcı başlığı: NONSERVIAM
Üye Tem 2009 tarihinden beri · 347 mesaj · Konum: Dersaadet
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
canalpay:
hadi d ile web framework yazalim :)

Aynısını bende dedim. Ama şuanki işlerimiz çok :) Ayrıca şu dkv'yi  bitirtmeden hiç bir şey yaptırtmam. Yoksa siz kendi veritabanınızı mı yapcaksınız yada mysql'i filan D'yemi iliştirceksiniz. :)
 

Ama dkv'yi bitirdikten sonra web framework için en azından en dandiğinden bir depolama sistemimiz olacak :)

yok ben veritabani vs. yazmayacagim, uzun sure once boyle bir fikir vardi sadece fakat nereden baslayacagimizi bilemedik. bir ton kaynak okuduk fakat sonra oyle kaldi o proje. benim aslinda d'yi kullanmak istememin sebebi c++ kadar guclu fakat onun kadar karmasik olmamasi. ben aslinda d ile bir IDE gelistirmek niyetindeyim.
http://www.mengu.net - some kind of monster
canalpay (Moderatör) #13
Kullanıcı başlığı: Can Alpay Çiftçi
Üye Tem 2009 tarihinden beri · 1133 mesaj · Konum: İzmir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Hmm sanırım iyi bir veritabanı sistemi yazmak istediniz ama olmadı.

İde geliştirme fikri bana garip geldi :-) Ama D ile de çok fazla ide geliştirilmiş sanırım.

Örnek olarak: http://dsource.org/projects/poseidon

DWT pencere sistemi için kullanılmış ve D ile yazılmış.

http://dsource.org/projects/elephant

http://dsource.org/projects/leds ....

Çok var. D1 ile yazılmış olabilir çoğru ama eminim fikir olarak birşeyler verecektir size.
Mengu (Moderatör) #14
Kullanıcı başlığı: NONSERVIAM
Üye Tem 2009 tarihinden beri · 347 mesaj · Konum: Dersaadet
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
canalpay:
Hmm sanırım iyi bir veritabanı sistemi yazmak istediniz ama olmadı.

İde geliştirme fikri bana garip geldi :-) Ama D ile de çok fazla ide geliştirilmiş sanırım.

Örnek olarak: http://dsource.org/projects/poseidon

DWT pencere sistemi için kullanılmış ve D ile yazılmış.

http://dsource.org/projects/elephant

http://dsource.org/projects/leds ....

Çok var. D1 ile yazılmış olabilir çoğru ama eminim fikir olarak birşeyler verecektir size.

eger windows icin yapacak olsaydim, d veya baska bir dille hic ugrasmazdim, c# gibi harika bir dili kullanirdim. nitekim onunla her sey cok basitti.

ide d ile yazilmis olacak sadece, d idesi olmayacak :)

evet iyi bir veritabani yazmak istedik ama baslamak kismet olmadi, baska bahara artik :)
http://www.mengu.net - some kind of monster
canalpay (Moderatör) #15
Kullanıcı başlığı: Can Alpay Çiftçi
Üye Tem 2009 tarihinden beri · 1133 mesaj · Konum: İzmir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Benim verdiğim örnekler D-ide'si olabilir ama ayrıca D ile yazılmışlar.

Yani sana D ile yazılmış örnekler verdim. Sanırım tek Elephant d ile yazılmamış.
bir ton kaynak okuduk fakat sonra oyle kaldi o proje

O kaynakları banada gösterebilir misiniz ? Merak ettim de ? Normalde nasıl bir şekilde yazılmalı.

Bu arada ben dkv'yi yazarken asıl örnek aldığım proje buydu: http://dsource.org/projects/filebase/

Ama tabii bu projeyi tam incelemeden dkv'yi yazdım. Ve bence dkv'nin son hali bundan daha iyi olacak. Hatta şu anki hali bile daha iyi olabilir. Neden mi ?

1. filebase sadece windows için.
dkv ise iki popüler işletim sistemi olan windows ve linux ile çalışıyor.
2. filebase eşleme tablosuna aktarılmadan çalışıyor. Bu yüzden bazı anlarda daha yavaş çalışabilir :-)
3. dkv dosyaları daha çok ayırıyor.

Tabii saydıklarımın hepsi doğru olmayabilir.

Ama filebase'in de avantajları var.
1. Ben yazmadım. Bu büyük bir artı.
2. kararlı.
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:  1  2  sonraki 
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-18, 09:42:33 (UTC -08:00)