Forum: Projeler dkv RSS
DKV -Dosya Kaynaklı Veri (Tabanı)-
Sayfa:  önceki  1  2  3  4  sonraki 
acehreli (Moderatör) #31
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4431 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj ID 1361
./make, "bu dizindeki make programı" anlamına geliyor. Senin bulunduğun dizinde öyle bir program olmadığına göre, yalnızca make yazman gerekir. O da PATH'teki dizinlerde sırayla aranır, ve bulununca çalıştırılır.

make de işine başlayınca, özel bir dosya belirtilmemişse öncelikle bu dizin içinde bir make dosyası bulmaya çalışıyor.

Dosyayı sırayla şu isimlerde arar: GNUmakefile, makefile, ve sonra Makefile... Ben çalıştığım projelerden alışık olduğum için Makefile olarak isimlendiriyorum.

Eğer make'e "git şu dizindeki programı oluştur" demek istiyorsak, -C seçeneği kullanılır:

make -C ~/deneme/d

Ali
canalpay (Moderatör) #32
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ı
Bilgilendirme için teşekkürler. Ben ./make diye kullandığımı hatırlıyorum da.  Sorun ondanmış.

Ama böylesi daha iyi oldu. Hem nasıl Makefile dosyası yazılacağını öğrendim. Hem de artık svn'yi konsoldan kullanmaya karar verdim :-)
Ben guiye gönderme diyorum o mesajsız gönderiyor. Var mı konsol gibisi :-)

Ayrıca son makefile dosyasına bakarsanız iyi olur. Ne eksik ne fazla değerlendirirsiniz.
canalpay (Moderatör) #33
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 arada projeden son durum :

Şuan yapabildikleri:
1. Veritabanı oluşturabiliyor.
2. Tablo oluşturabiliyor.
3. Veri dosyası oluşturabiliyor.
4. Veri dosyasını silebiliyor.
5  Tablo silinebiliyor. (İçinde veri dosyası varsa silinmez.)
6. Veri tabanı silinebiliyor. (İçinde tablo varsa silinmez)
7. __sil__() işlevi ile belirtilen dosya yada dizin(alt dizinleri ile birlikte.) silebiliyor.
8. veri_güncelle işlevi eklendi.(dosyayı silip farklı bilgilerdeki yeni dosya oluşturuyor.)
9.veri_değiştir işlevi eklendi.(dkv için std.string'deki replace komudu sayılır.).
10. Belge eklendi.
11. Makefile dosyası eklendi.

Bu arada bunlara nasıl bir unittest hazırlanır bilemiyorum. En iyi olasılık sözleşmeli programlamadan yararlanılır ama o bile bence gereksiz. Yeri geldiğinde verdiği hatalar bence proje için yeterli.

Şuan yapmayı düşündüğüm yapamadığım tek işlev v_yedekle işlevi. Bu işlev belirtilen veritabanını zip ile sıkıştıracak ve yedek dizinine zip'i atacak. zip dosyasının adı veritabanıadı_10_11_2010_11_37 gibi olacak.(İlk veritabanının adı sonra o günün tarihi ve ziplenirkenki anın saati.)(Yapamadıklarım ziplemek ve tarih atmak. Şuan kütüphaneye bakıp öğrenmeye çalışacağım.)

Bu dkv her bir işi en basit şekilde yapabiliyor. Ama sizce bunu geliştirmeli miyiz? Örneğin veritabanının ismini değiştiren işlevler gerekiyor mu?(Bunlar gerekiyor sayılabilir.) Hadi bunlar önemli değilde sorgula gibi bir işlev gerekiyor mu ?
Örn:
dkv_sorgula("SEÇ veritabanı/tablo/veri.dkv SATIR 4 EĞER $A<5 ");
dkv_sorgula("SEÇ veritabanı EĞER $veritabanı=='b'")
Bunun gibi bir işlev sizce gerekli mi ?

Eğer gereksizce yavaş yavaş dkvg projesine başlayacağım(dkv güvenli :-) )
Bu mesaj canalpay tarafından değiştirildi; zaman: 2010-01-17, 23:15.
acehreli (Moderatör) #34
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4431 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
canalpay:
Bu arada projeden son durum :

Ben henüz oynayacak zaman bulamadım. :/

Şuan yapabildikleri:

Çok kapsamlı! :)

Bu arada bunlara nasıl bir unittest hazırlanır bilemiyorum.

Birim testlerinin kısıtlı olduğu durumlar vardır. Özellikle dosyalar gibi dış dünyayla etkileşmeye başlayınca işler karışır.

Mock object, fake object, vs. gibi sınıflar yazılarak sanki dış dünyayla etkileşiliyor gibi yapılır.

Bu dkv her bir işi en basit şekilde yapabiliyor. Ama sizce bunu geliştirmeli miyiz? Örneğin veritabanının ismini değiştiren işlevler gerekiyor mu?(Bunlar gerekiyor sayılabilir.)

O, veri tabanının bakımı ile ilgili bir konu gibi geliyor. Herhalde programın çalışması sırasında veri tabanının ismini değiştirmek gerekmez. (?)

Hadi bunlar önemli değilde sorgula gibi bir işlev gerekiyor mu ?

En azından verilerin eklenmesinin karşıtı olarak verilere erişilebilmeli.

Örn:
dkv_sorgula("SEÇ veritabanı/tablo/veri.dkv SATIR 4 EĞER $A<5 ");
dkv_sorgula("SEÇ veritabanı EĞER $veritabanı=='b'")
Bunun gibi bir işlev sizce gerekli mi ?

O bayağı becerikli olur. :)

Peki verilere nasıl erişiliyor? Satır satır yazıldığı için satır numarasını bilmeliyiz galiba...

Eğer gereksizce yavaş yavaş dkvg projesine başlayacağım(dkv güvenli :-) )

Onu da paralel olarak götürebilirsin.

Ali
acehreli (Moderatör) #35
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4431 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #32
canalpay:
Ayrıca son makefile dosyasına bakarsanız iyi olur. Ne eksik ne fazla değerlendirirsiniz.

Bence şöyle olmalı:

dkv: belge derle

.PHONY: derle
derle:
    dmd deneme.d dkv.d
    ./deneme
 
.PHONY: belge
belge:
    dmd deneme.d dkv.d belge.ddoc -D -Ddhtml
 
.PHONY: sil
sil:
    rm html -rf
    rm deneme -rf
    rm deneme.o -rf


- Özel bir hedef belirtilmezse ilk hedef kullanılır. Onun ismi dkv, ve o, kendisin başka iki hedefin oluşturulmasına ihtiyaç duyuyor

- .PHONY hedefleri, dizinde yanlışlıkle hedef ile aynı isimde bir dosya olursa işler bozulmasın diyedir. Örneğin asıl amacımız 'belge' isminde bir dosya oluşturmak olmadığı için, "dizinde belge isminde bir dosya varsa bile bu işlemleri çalıştır" demek için .PHONY: belge diyoruz

- O satırın altında da bir belge: olmalı. O da belge hedefinin nasıl oluşturulacağını belirtir

Bu dosyayı projeye eklemiyorum; çünkü ikinci defa çalıştırıldığında birim testleri şikayet ediyor:

./deneme
object.Exception: Hata: Veritabanı zaten var
make: *** [derle] Error 1

Ali
canalpay (Moderatör) #36
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 dosyayı projeye eklemiyorum; çünkü ikinci defa çalıştırıldığında birim testleri şikayet ediyor:


İşlev hata veriyor. Bunun nedeni de oldukça açık. Denemeyi çalıştırdığınızda oluşturduğunuz veritabanını yine oluşturmuyor. Diyebilirsiniz ki neden oluşturduğu veritabanını silmiyor. Nedeni açık. veri dosyalarının içiyle oynuyorum. Ama gerçekten oynamış mıyım  gözümle görmem gerekiyor.

Yapabileceğimiz en iyi iş denemedeki veritabanının adının değişmediğini varsaymak ve sil komuduna o veritabanınıda eklemek.

Acaba benim makefile ile sizin makefile  farklı şekilde mi çalışıyor ?
Benimki :
dkv:(.PHONY eklemeyi unutmuşum :-) Eklediğimizi varsayalım :-) )
        dmd deneme.d dkv.d
        dmd deneme.d dkv.d belge.ddoc -D -Ddhtml

.PHONY derle:
        dmd deneme.d dkv.d
        ./deneme

.PHONY belge:
        ./dmd deneme.d dkv.d belge.ddoc -D -Ddhtml

.PHONY sil:
        rm html -rf
        rm deneme -rf
        rm deneme.o -rf

En azından verilerin eklenmesinin karşıtı olarak verilere erişilebilmeli.
ve
Peki verilere nasıl erişiliyor? Satır satır yazıldığı için satır numarasını bilmeliyiz galiba...

şuan veri_oku işlevi ile zaten erişebiliyoruz. Çıktısı dchar[][]  yani 2. satırın 7.elemanına ulaşabilmek için(Denemedim :-) ) :
dchar[][] çıktı;
auto taban= new dkv;
taban.veri_oku(çıktı,"iss"d.dup,"sss"d.dup);
std.stdio.writeln(çıktı[1][6]); //diyerek bence 2.satırın 7.elemanına ulaşabiliriz. 

çalışması gerekir.
canalpay (Moderatör) #37
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ı
dchar[][] çıktı;
auto taban= new dkv;
taban.veri_oku(çıktı,"iss"d.dup,"sss"d.dup);
std.stdio.writeln(çıktı[1][6]); //diyerek bence 2.satırın 7.elemanına ulaşabiliriz. 

Derledim çalışıyor. Ama benden size uyarı gerçekten 1.satırın 7.elemanı olsun. Yoksa derlersiniz çalıştırdığınızda hata verir.(Range violation) ondan sonra ben bunun hiçbir şeyini bozmadım niye hata veriyorsun dersiniz. (Ben bunları yaşadım :-) )

Eğer eleman eleman değilde bütün metni okumak için biraz kod yazmak gerekecek. Örn:
dchar[][] çıktı;
auto taban= new dkv;
taban.veri_oku(çıktı,ad,dene);
foreach(tekli;çıktı)
std.stdio.writeln(tekli); //hepsi yazılıyor. 


Denenmiştir çalışıyor. Ama benim merak ettiğim bir şey var. Neden direk writeln(çıktı); diyemiyoruz ?
canalpay (Moderatör) #38
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ı
12.düzeltmemi code.google.com'a yollamış bulunmaktayım.(konsol ile svn kullanmak gerçekten daha rahat :-) )

Bunda sadece v_yedekle işlevi eklendi.(Ve şuan hatırladım. Açıklama satırları yanlış. Çünkü açıklamayı yazdıktan sonra v_yedekle'nin çalışma prensibini değiştirdim :-) )

v_yedekle(yedeklencekveritabanınınadı, yedeğinadı) şeklinde. Yedeklenecek veritabanının zip dosyası oluşturuluyor.(Ne yazıkki phobos'un belgelerinden hiç bir şey anlamadım. Bu yüzdende konsoldan zipleme işini yaptım :-) ). Daha sonra yedek veritabanı yedek adlı dizine taşınıyor. Eğer daha önce aynı adlı yedek varsa hata verip hiç bir işlem yapmadan programdan çıkıyor.

İlk başta işlevi yedeğin adına karar verecek şekilde tasarladım. Bunun içinde phobos'un date modülüne baktım ve ne yazıkki yine belgelerden hiç bir şey anlamadım. Bu sefer C'de bunu nasıl yapıyorlar diye baktım. Onda da anlamadım :-) . Ee bende konsoldan tarihi öğrenir onu ad olarak koydurturum dedim ve konsola Date yazdırarak hallettim ama bu seferde konsolda çıkan veriyi nasıl işleve tanımlatacağımı anlayamadım. Bu sefer bende dedim ki en iyisi işlevi çağıran kendi yedeğinin adına karar versin. Ve her bir şeyi ona göre kodladım.

Ama hala tarih işini yapmaya çalışacağım. Çünkü yedek veritabanını yedek dizininin o günkü tarihli dizinin içine koyacağım.
acehreli (Moderatör) #39
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4431 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #36
canalpay:
Acaba benim makefile ile sizin makefile  farklı şekilde mi çalışıyor ?

Evet. Makefile, yukarıda "Bence şöyle olmalı" dediğim gibi olmalı.

Yoksa senin .PHONY satırların doğru çalışmıyor. Yani senin make dosyanda derle ve belge diye hedefler yok. make derle veya make belge çalışmıyor.

Zaten o yüzden ./deneme satırı sende çalışmıyor ve sen benim yaşadığım hatayı yaşamıyorsun.

dchar[][] çıktı;
auto taban= new dkv;
taban.veri_oku(çıktı,"iss"d.dup,"sss"d.dup);
std.stdio.writeln(çıktı[1][6]); //diyerek bence 2.satırın 7.elemanına ulaşabiliriz. 

Programın daha önce yazdığı verinin hangi satırda bulunduğunu aklında tutması gerekiyor yani. Program kapanıp açıldıktan sonra daha önce kaç satır yazmış olduğunu bile bilemeyecektir.

Belki de veritabanına kaç bilgi olduğunu da sorabiliriz. Ama bu sefer de doğrudan dosyadan satır satır okumaktan fazla bir yarar sağlamamış olduk.

Acaba verilere isimler verilse daha kullanışlı olur mu? Yani bir eşleme tablosu gibi çalışsa; ama perde arkasında bir dosyayı kullansa:

string adet = taban.veri_oku("öğrenci_adedi");
string not = taban.veri_oku("öğrenci/ali/not");

O zaman program her çalıştığında her bilgiyi dosya ne kadar büyük olsa da bulur.

Ali
acehreli (Moderatör) #40
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4431 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #37
canalpay:
Neden direk writeln(çıktı); diyemiyoruz ?

std.stdio becerikli bir modül değil. C kütüphanelerine çok yakın olduğu için onlardan fazla becerikli olmamış. Ben std.cstream'i çok daha kullanışlı buluyorum:

import std.cstream;
 
void main()
{
    dchar[][] çıktı;
    dout.writefln(çıktı);
}

Ali
acehreli (Moderatör) #41
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4431 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #38
canalpay:
Ama hala tarih işini yapmaya çalışacağım

Şundan yola çıkabilirsin:

import std.cstream;
import std.date;
 
void main()
{
    d_time şuAn = std.date.getUTCtime();
 
    Date zaman;
    zaman.parse(std.date.toString(şuAn));
 
    dout.writefln("%04s_%02s_%02s_%02s_%02s_%02s_%02s",
                  zaman.year, zaman.month, zaman.day,
                  zaman.hour, zaman.minute, zaman.second, zaman.ms);
}

İstersen milisaniye (ms) üyesini boşver; bende hep sıfır çıkıyor.

Eğer Türkiye saatini kullanmak istersen ve zaten öyle değilse, main'den önce bir yerde (veya dkv.d dosyasında) saat ayarını milisaniye mertebesinde belirle:

static this()
{
    std.date.localTZA = 2 * 1000 * 60 * 60;
}

Ali
canalpay (Moderatör) #42
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ı
Acaba verilere isimler verilse daha kullanışlı olur mu? Yani bir eşleme tablosu gibi çalışsa; ama perde arkasında bir dosyayı kullansa:

string adet = taban.veri_oku("öğrenci_adedi");
string not = taban.veri_oku("öğrenci/ali/not");

O zaman program her çalıştığında her bilgiyi dosya ne kadar büyük olsa da bulur.


Bence veri dosyasının kendisini bir eşleme tablosu olarak düşünebiliriz. (?)
Yada 2 satırı bir eşleme tablosu olarak düşünebiliriz(En iyisi bu herhalde). İlk satırda anahtar olan veri 2. satırda değer yer alır ?
Ama bunu bizim yapmamıza bile aslında gerek yok(Yapmayalım demiyorum :-) ) Bir programcı dkv'yi böyle kullanabilir.(Yaşasın dkv çok esnek :-D )

Zaman ayarları içinde teşekkürler. Aslında bu yazdığınız kodları wiki'ye koymak gerekiyor. Sonra açıklamasını koyarız.(?)
canalpay (Moderatör) #43
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ı
17. düzeltmeyi yayınladım. Bunlarda :
1.v_yedekle iki parametre alıyordu. Artık 2.parametreyi öntanımlı yaptım. Artık 2.parametre girilmez ise öntanımlı olarak veritabanının ismi 2.parametrenin değeri olacak. =>16.Düzeltme
2. Yine v_yedekle ile ilgili. v_yedekle'nin açıklama satırlarını düzelttim. =>17.Düzeltme

Proje yavaş yavaş biçimleniyor. Şuan istersek bir çok işi bu proje ile yapabiliriz.

Acaba verilere isimler verilse daha kullanışlı olur mu? Yani bir eşleme tablosu gibi çalışsa; ama perde arkasında bir dosyayı kullansa:

string adet = taban.veri_oku("öğrenci_adedi");
string not = taban.veri_oku("öğrenci/ali/not");

O zaman program her çalıştığında her bilgiyi dosya ne kadar büyük olsa da bulur.


Bunu yine düşündüm. Bazen(Çoğunlukla) sizin dediğiniz gibi oluyor. Ama yine bazen benim yaptığım gibi olmalı(Bence). Bende bunu şu biçimde halledeceğimizi düşündüm; İlk olarak eski işlevler hiç ellenmeyecek. Bu iş için yeni işlevler tanımlanacak. Bu işlevlere 1 parametre daha eklenecek. Bu parametre de anahtar sözcüğü belirtebilmek için kullanılacak. Bu işlevlerin adı eski işlev ile aynı olup(akılda tutması kolay olup gerektiğinde iki işlevin yaptığı işi bilebilmek için) sonuna -_eş eki gelecek(Örn : veri_oku_eş()).

İşlevde şu biçimde çalışacak:
Dosyada anahtar sözcüğün belirtilmesi: -*-Anahtar Sözcük-*-
Daha sonraki satırlarda yeni bir "-*-" belirtimi bulana kadar yazılan veriler "Anahtar Sözcük" belirtiminin değeri olarak sınıflandırılacak.
Örn(a/a/a.dkveş dosyamız):
-*-anahtar sözcük-*-
Merhaba
Dünya

-*-212-*-
Merhaba dünyalı biz dostuz .

Burada oku işlevini çağırıyoruz.
veri_oku_eş(oku,"a"d.dup,"a/a"d.dup,"anahtar sözcük"d.dup)
Ve oku[][] değişkeninin değeri:
Merhaba
Dünya



Son olarak belirteyim, eş işlevleri .dkveş uzantısı normal işlevler ise .dkv uzantısını kullanacak.

Sizin aklınızda şöyle bir soru takılmış olabilir. Eğer yazılan veride -*- belirtilimi var ise ne yapacağız. Diğer programlama dillerinde olduğu gibi başına "\" belirteci koyacağız.


Sizce bu fikirde yanlış, eksik, fazla bir tarafı var mı ? Görüşlerinizi bekliyorum.
acehreli (Moderatör) #44
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4431 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
canalpay:
Proje yavaş yavaş biçimleniyor.

Süper! :)

Şuan istersek bir çok işi bu proje ile yapabiliriz.

Olası pürüzlerini temizlemek için kullanılması gerek.

Görüşlerinizi bekliyorum

(Yeni koda bakmadan:) Bence herşey güzel. Amacını gerçekleştiriyor! :)

Ali
canalpay (Moderatör) #45
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ı
Olası pürüzlerini temizlemek için kullanlması gerek.


dokul hala aklımda. dkv için dokul çok iyi bir proje.
(Yeni koda bakmadan:) Bence herşey güzel. Amacını gerçekleştiriyor! :)

Ali

Yeni kodda dediklerim yok. Daha kodları yazmadım(Muhtelemen benim yazdığım en zor kodlar olacaktır. Çünkü bu iş resmen derleyici yazmaya benzeyecek. ). Sadece kendime yol haritası çizdim ve sizden fikir olarak onay bekliyorum. Sizcede fikirlerim doğru ve uygulanabilirliği yüksek ise yazmaya başlayacağım.

Şimdi dkv kodlarına baktımda tahmin ettiğimden daha zor olacak. Çünkü bir çok işlev yeniden yazılacak ve belki anlamları değişecek. Yeni anlamlarının ne olacağını düşünmemiz gerekecek. Değişecek olan işlevler :

1.veri_ekle
2.veri_sil(Hangi anahtardaki veri silenecek.  Ve nasıl silenecek :-) yada tamamen dosya mı silinecek :-) Düşünmek gerekiyor.)
3.veri_oku
4.denetle(Birde veride belirtilecek anahtarda bilgi var mı diye denetlemesi gerekecek tahminim :-) )
5.veri_güncelle(Bu tam bir kaos)
6.veri_değiştir(Buda aynen tam bir kaos)
Bu mesaj canalpay tarafından değiştirildi; zaman: 2010-01-19, 10:51.
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  3  4  sonraki 
Forum: Projeler dkv 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-07-27, 01:48:02 (UTC -07:00)