Forum: Projeler dkv RSS
DKV -Dosya Kaynaklı Veri (Tabanı)-
Sayfa:  önceki  1  2  3  4 
acehreli (Moderatör) #46
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4391 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj ID 1376
canalpay:
Çünkü bir çok işlev yeniden yazılacak ve belki anlamları değişecek.

İş çıkarttığıma üzüldüm. :)

Acaba verilerin hep bellekte durmaları nasıl olur? Bütün işlemler bellekte yapılır. En sonunda kaydedilirler. (?)

Ali
canalpay (Moderatör) #47
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ı
İş çıkarttığıma üzüldüm. :)

Yok böylesi daha iyi oldu. Yoksa yapacak iş bulamayacaktım. Hem hatırlıyor musunuz bu iş derleyici yazmak gibi olacak demiştim. Ben gerçekten bir derleyici yazmak istiyordum. Çünkü ilerde kendime Dil yazmak istiyorum :-D
Acaba verilerin hep bellekte durmaları nasıl olur? Bütün işlemler bellekte yapılır. En sonunda kaydedilirler. (?)

Bunun nasıl olacağını tam anlayamadım. Ama dediğim yöntem iyi ama tek zor olacağı için istemiyorsanız boş verin böyle daha iyi oldu. Ama bu daha iyi bir seçenek olduğu için diyorsanız bunu bir düşünelim.

Bu arada şimdi veri_ekle_eş işlevini yazdım. (Bir öncekinin kopyası :D) Açıklama satırlarını değişebilme ihtimali olduğu için yazmadım.
veri_ekle_eş işlevini incelerseniz sevinirim.(Svn ile gönderdim.)
acehreli (Moderatör) #48
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4391 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
canalpay:
Acaba verilerin hep bellekte durmaları nasıl olur? Bütün işlemler bellekte yapılır. En sonunda kaydedilirler. (?)

Her işlem için dosyanın açılması, verinin aranması, ve kapatılması yavaş olabilir diye düşündüm. Eğer bütün işlemler bellekteki bir eşleme tablosunda yapılırsa, en sonunda hepsi birden kaydedilir.

Tabii o zaman bir eşleme tablosunun üstüne fazla bir şey katmadığını söyleyebilirsin.

Sonlandırıcı işlevinde otomatik olarak kaydetmesi güzel bir olanak olarak kabul edilebilir. vs.

Ali
acehreli (Moderatör) #49
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4391 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #47
canalpay:
veri_ekle_eş işlevini incelerseniz sevinirim

Diğer işlevlerde de olan bir durum var: bir çok değişkene gerek yok aslında. Hatta sınıfın üyesi olan veri'nin bu işlem sırasından neden değiştiği belli değil.

Hatta sınıf üyelerinin çoğuna gerek bile yok gibi. Üyeler, o nesne yaşadığı sürece akılda tutulması gereken bilgiler için kullanışlıdır.

Ayrıca, ne kadar az kod yazarsak o kadar az hata yaparız. :)

Bir örnek olarak, bu işlevde veri yazma işi için doğrudan parametreyi kullanabiliriz:

        dosya.writeln(to!string(veri_));

Ali
canalpay (Moderatör) #50
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ı
Yanıtlanan mesaj #48
Her işlem için dosyanın açılması, verinin aranması, ve kapatılması yavaş olabilir diye düşündüm. Eğer bütün işlemler bellekteki bir eşleme tablosunda yapılırsa, en sonunda hepsi birden kaydedilir.

Bunu tam olarak nasıl yapacağımızı anlayamadım(Sanırım saat geç olunca kafam çalışmıyor. Soğuması gerekecek :-D ).
Nasıl yapılacağını açıklayabilir misiniz ?


Her işlem için dosyanın açılması, verinin aranması, ve kapatılması yavaş olabilir diye düşündüm. Eğer bütün işlemler bellekteki bir eşleme tablosunda yapılırsa, en sonunda hepsi birden kaydedilir.

Ama şöyle bir şey de var. Biz ne olursa olsun derlenen yüksek seviyeli olmayan(alçak orta bilemiyorum :-) ) bir dil kullanıyoruz. Bunu göz önünde bulundurmalıyız. Ayrıca bu proje tam bir veritabanı değil. Önceliği hız değil bu projenin. Önceliği sadece çok kolay dosya oluşturup bilgi kaydedebilmek bazı işlemler yapabilmek. Dosyalar veritabanı olarak kullanılabildiği için ve şuan D2 için bir veritabanı kullanamadığımız için(Yoksa kullanabiliyor muyuz ?) biraz veritabanına benzemesini istiyorum.

Ve ama bunca şey yazdıktan sonra projenin daha hızlı çalışmasını istiyor musunuz, daha hızlı çalışabilmesi için ağır bir yükün içine girer misiniz diye sorarsanız yanıtım kesin evet! olacaktır.
canalpay (Moderatör) #51
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ı
Diğer işlevlerde de olan bir durum var: bir çok değişkene gerek yok aslında. Hatta sınıfın üyesi olan veri'nin bu işlem sırasından neden değiştiği belli değil.

İnanır mısınız kodu yazarken kendime bunun açıklamasını yapıyordum. (Kendime de tam cevap veremedim.)
1. Sınıfın üyesi olan string veriyi program sırasında hiç kullanılmamış olarak erişebilmek için.(Büyüklerimizden öyle öğrendik :-D )
2. veri_s'yide kullanma nedenim:  sınıfta bir kereden daha fazla veri_ değişkenini string'e çevirirken tekrar tekrar kod tekrarı yapmamak için.
3. Ayrıca her bir şeyi bir sabite aktarıyorum çünkü o değerleri tekrar kullanmayacağıma dair kendime garanti veremiyorum.

Ama zaten immutable olarak tanımladığım bir veri değişmeyeceği için veri'nin türü string iken veri_s tanımlanması gereksiz. Ben sadece şimdiye kadar gördüğüm bütün sınıflarda sınıf üyesindeki sabit yada değişkenin kodda kullanılmadığını gördüğüm için ayrıca veri_s tanımlıyordum.  Tek o değişken gereksiz. O da sınıf üyesi sınıfın işlevinde kullanmak yasal ise.

Ayrıca, ne kadar az kod yazarsak o kadar az hata yaparız. :)


Bir projede ne kadar az kod varsa kod bakımı o kadar çok olur.(Yoksa hiç merhaba dünya yazmamış hayatın az kod yazmış biri az hata yapmaz :-) Örnek ben :-) ) Ama doğru söylüyorsunuz. Bir kod değiştirdiğimde bazen kod takibi yapamıyorum.(Kodları yazan ben olduğum halde :-) )
acehreli (Moderatör) #52
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4391 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #50
canalpay:
Eğer bütün işlemler bellekteki bir eşleme tablosunda yapılırsa, en sonunda hepsi birden kaydedilir.

Nasıl yapılacağını açıklayabilir misiniz ?

Bir sınıf üyesi olur:

string[string] veriler;

Bütün işlemler onun üzerinde yapılır. Sonra da hepsi birden dosyaya kaydedilir. Belki kullanıcı kaydet() deyince, belki de sonlandırıcı işlevde.

Biz ne olursa olsun derlenen yüksek seviyeli olmayan(alçak orta bilemiyorum :-) ) bir dil kullanıyoruz. Bunu göz önünde bulundurmalıyız.

Doğru ama dosyaya erişmeye harcanan zamanın bu programın derlenmiş olan kodlarıyla o kadar ilgisi yok. Zamanın çoğu işletim sistemi, dosya sistemi, ve asıl sabit disk erişimine harcanır.

Temel bir kural olarak, işin içine giriş/çıkış işlemleri girdiği an başka hiçbir şeyin pek önemi kalmaz.

Önceliği sadece çok kolay dosya oluşturup bilgi kaydedebilmek bazı işlemler yapabilmek.

Kabul. Hiçbir itirazım yok. :) Amacı belirlemek önemli.

Ali
acehreli (Moderatör) #53
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4391 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #51
canalpay:
1. Sınıfın üyesi olan string veriyi program sırasında hiç kullanılmamış olarak erişebilmek için.(Büyüklerimizden öyle öğrendik :-D )

Ama o veriye erişilmiyor. Zaten bütün dkv sınıfındaki tek bir veri'nin işi ne olabilir? Olsa olsa "son işlemde kullanılan veri" anlamına gelir ve o da hem kullanışlı değildir hem de hatalara yol açabilir. (Çağırdığım bir işlev bir veri işlemi yaptığı an veri benim haberim olmadan değişir. Buna non-reentrancy denir.)

Her üyenin o nesneye ait olması gerekir. Yoksa gerek yok.

2. veri_s'yide kullanma nedenim:  sınıfta bir kereden daha fazla veri_ değişkenini string'e çevirirken tekrar tekrar kod tekrarı yapmamak için.

Kod tekrarı olan yerlerde kabul. :)

3. Ayrıca her bir şeyi bir sabite aktarıyorum çünkü o değerleri tekrar kullanmayacağıma dair kendime garanti veremiyorum.

Parametre sabit olduğu sürece onu değiştiremezsin. Ayrıca yerel bir sabite bu nedenle gerek olmamalı.

Ali
canalpay (Moderatör) #54
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ı
Bir sınıf üyesi olur:

string[string] veriler;


Bütün işlemler onun üzerinde yapılır. Sonra da hepsi birden dosyaya kaydedilir. Belki kullanıcı kaydet() deyince, belki de sonlandırıcı işlevde.

Bu şekilde yazmaya başlıyordum ama aklıma şöyle bir soru geldi. Zaten dkv'nin temelde becerebildiği iki işlev var.
1. Yazma
2. Okuma

Herhalde eşleme tablosu sadece okuma işlevi için gerekli.  (Eşleme tablosu yazmada bir işe yarar mı ? Sadece yazılacak o kadar basit.)

1.Okuma için ne yapacağız?(Eşleme tablosu için)
Bence ilk önce dosyayı eşleme tablosuna aktaracağız.(Kod olarak bunu nasıl yapabileceğim aklımda tam canlanmadı.) Daha sonra okunmak istenen şeyi şu şekilde çalıştıracağız. eşlemetablosu[anahtar]; 

Bunun için derleyici ne yaptı ? İlk önce dosyayı tamamen okudu.(Burada tamamen okumakla büyük bir zaman kaybetti bence.) Daha sonra eşleme tablosuna aktardı.(Eğer ben eşleme tablosuna aktaracak kodları yazarsam eskisinden daha yavaş çalışır :-) ) Daha sonrada eşleme tablosu ile veriyi aldık. Bunun ne iyi yanı olabilir ? Aynı veriyi birden fazla okuyacaksak 2 kere dosya açılmayacağı için daha hızlı çalışır. Ya aynı veriyi birden fazla kere okumak istemezsek :-D

2.Ama eşleme tablosu yapmadan bunu halledersek ne yapacağız. ?
Bir satır okunacak.*-*anahtarsözcük-*- tutuyorsa o satırdan sonraki satırları -*- dizgi dilimi  var mı diye bakacak. Yoksa veriye ekleyecek varsa istenen veri bitti deyip veriyi sana yollayacak.

1.ve 2. bir kere çalıştırırsak bence 1. daha yavaş çalışır. Sadece verilen anahtar en sonda ise aynı hızda çalışır.

Şuan sadece veri_ekle, veri_oku adına konuşuyorum. veri_güncelle, veri_değiştir adına konuşmuyorum. Ama bunlar içinde bir şey fark edeceğini sanmıyorum.


Birde siz veritabanlarını büyük bir olasılıkla benden daha çok kullandınız. Şu sözleri duymuş olmalısınız:
"Veritabanı ile işiniz bir kereliğine olmalıdır.(Yani o veri bir kere okunmalıdır.) Eğer birden fazla okunacak ise veri tamamen okunmalıdır ve siz programınızda bunu ayırmalısınız. Çünkü veritabanları her veriyi okumak için bir dosyayı açar ve bir daha kapatır. Bu da programınızın hızını olumsuz yönde etkiler. "




Bu sözler php gibi yorumlanan(Yani yavaş çalışan )bir programlama dilinde söylendiği ise D'de haydi haydi söylenmesi gerekmez mi ?

acehreli:
Doğru ama dosyaya erişmeye harcanan zamanın bu programın derlenmiş olan kodlarıyla o kadar ilgisi yok. Zamanın çoğu işletim sistemi, dosya sistemi, ve asıl sabit disk erişimine harcanır.


Bunu bende test ettim hatta size sormuştum :-) Bir D ile çıktı veren kodlar. Birde D kodlarının Python sürümü. 2side aynı hızda çalıştı denebilir.

Ama şöyle bir şey olsa.
D ile 2 saniye süren bir iş yapacaksınız ondan sonra 1 saniye çıktı yazacaksınız. Sizce bu 1 saniye sizin için önemli mi ?

Python ile de aynı işi yapacaksınız ama python sizi 2 değil 20 saniye bekletecek. Ve yine 1 saniye çıktı yazacaksınız. Sizce bu 1 saniye sizin için önemsiz mi ?


Kodları temizleme işini dkv bittikten sonra yapacağım.

Dkv için şifreleme işini de şu şekilde yapmaya karar verdim:
DKV'den bağımsız bir şifreleme aracı yazacağım. Bu şifreleme aracı sizin verdiğiniz şifreye göre şifreleyecek ve geri dönüşü olacak. (Bunu yapan bir şifreleme metodu biliyor musunuz? Benim aklıma tek base64 geliyor. Ama bildiğim kadarı ile ondanda şifre veremediğimiz için herkes okuyabilir.)
Şifreli olarak veriyi göndermek isteyen kişi bu araçtan yararlanır.(Böylece şifreleme aracı dkv kullanmak isteyen yada istemeyen herkesin hizmetinde olacak :-) )
acehreli (Moderatör) #55
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4391 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
canalpay:
Bence ilk önce dosyayı eşleme tablosuna aktaracağız.(Kod olarak bunu nasıl yapabileceğim aklımda tam canlanmadı.)

Anahtar ve veriyi ayrı ayrı okumayı biliyorsun. Eşleme tablosuna yerleştirmek şu kadar basit:

eşlemetablosu[anahtar] = veri;

Daha sonra okunmak istenen şeyi şu şekilde çalıştıracağız. eşlemetablosu[anahtar]; 

Evet, onu demek istemiştim.

Bunun için derleyici ne yaptı ? İlk önce dosyayı tamamen okudu.(Burada tamamen okumakla büyük bir zaman kaybetti bence.)

Denemeden bilemeyiz. Ama sabit diske erişimin belleğe erişimden 1000 kat kadar yavaş olduğu gibi bilgileri düşünmek gerek. (Yoksa daha mı fazlaydı? :) )

Aynı veriyi birden fazla okuyacaksak 2 kere dosya açılmayacağı için daha hızlı çalışır. Ya aynı veriyi birden fazla kere okumak istemezsek :-D

Güzel sorular. Kullanım amacını bilmeden cevap veremeyiz.

2.Ama eşleme tablosu yapmadan bunu halledersek ne yapacağız. ?
Bir satır okunacak.*-*anahtarsözcük-*- tutuyorsa o satırdan sonraki satırları -*- dizgi dilimi  var mı diye bakacak. Yoksa veriye ekleyecek varsa istenen veri bitti deyip veriyi sana yollayacak.

Eşleme tabloları 'hash table' olduklarından, veriye sabit zamanda erişirler. Tabloda ne kadar veri olursa olsun, her veriye erişim sabit zamandadır. Buna O(1) denir. (Algoritma karmaşıklığından bahsediyorum. Belleğe sığmama gibi dış etkenlerden değil.)

Dosyadan okuma yöntemin ise O(N). Yani verilere erişmek, dosyadaki veri adedine bağlı. N tane veri varsa, ortalama olarak veri erişimi dosyada N/2 kere ilerleme gerektirir. En kötü durumda, yani dosyanın en sonundaki elemana erişilmek istendiğinde bütün dosya baştan sona taranır.

Bence belirli sayıda veri oluşturarak bunu bir dene...

Birde siz veritabanlarını büyük bir olasılıkla benden daha çok kullandınız. Şu sözleri duymuş olmalısınız:
"Veritabanı ile işiniz bir kereliğine olmalıdır.(Yani o veri bir kere okunmalıdır.) Eğer birden fazla okunacak ise veri tamamen okunmalıdır ve siz programınızda bunu ayırmalısınız. Çünkü veritabanları her veriyi okumak için bir dosyayı açar ve bir daha kapatır. Bu da programınızın hızını olumsuz yönde etkiler. "

Veritabanları konusunda özel bir deneyimim yok ama söylemek istediklerim aynen o. :) Bence deneme programında şu sayılarda veri olduğu durumda programın hızına bak: 100, 10000, 10000, vs.

Eşleme tablosunun kılı bile kıpırdamaz; her veri anında gelir. :)

Fark, sen bu işi kullanıcının yapmasını bekliyorsun; ben ise dkv'nin olanağı olarak görüyorum. Yani ben yukarıdaki söylenenleri sana söylenmiş gibi okuyorum. ;)

Ama anlaştık. Sen yalnızca "şu dosyanın şu satırını ver" gibi bir hizmet sunuyorsun. O zaman anahtar kavramı yavaşlatacaktır bile. Çünkü her anahtar tekrar tekrar aranacak. Ve o yüzden de anahtar kullanmak istemeyeceğim. Peki hangi satırda ne olduğunu nereden bileceğim?

Eğer dkv veriyi bir kere okuyan ve bellekten sunan bir hizmet verse, uygulama programcısı olarak çok işe yarar. Ama öyle değil; ve öyle olmak zorunda da değil. :) Dediğim gibi, kullandıkça daha yararlı hale gelir. (Her yazılım gibi.)

D ile 2 saniye süren bir iş yapacaksınız ondan sonra 1 saniye çıktı yazacaksınız. Sizce bu 1 saniye sizin için önemli mi ?

Eğer o veriye 1000 kere erişeceksem 1000 saniye olur. Ama yukarıda anlaştık. Sen, benim bellekte saklamamı istiyorsun. Tamam.

Python ile de aynı işi yapacaksınız ama python sizi 2 değil 20 saniye bekletecek. Ve yine 1 saniye çıktı yazacaksınız. Sizce bu 1 saniye sizin için önemsiz mi ?

Aynı şekilde 1000 saniye olabilirdi. Yine anlaştık.

Dkv için şifreleme işini de şu şekilde yapmaya karar verdim:

Bu *farklı* ;) konuya gerçekten burada mı devam etmek istiyorsun? Tek konulu forum oldu. İleride aradıklarımızı nasıl bulacağız?

dsource'a baktım:

  http://dsource.org/projects/dcrypt

Bir de günlüğü şifreli olarak tutan şu programdan fikir edinilebilir belki:

  http://dsource.org/projects/kotivox

İkisine de bakmadım.

Ali
acehreli (Moderatör) #56
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4391 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj ID 1305
acehreli on 2010-01-03, 17:10:
Testlerindeki bütün türlerle çalışıyor. Zaten şablonlar olduğu için yeni inout'un gereğini tam anlamış değilim.

Sonunda anladım. :) İlgisiz bir konuda anlatıldı:

  http://www.digitalmars.com/webnews/newsgroups.…?art_grou…

inout, o konudaki örnekte gösterildiği gibi, üye işlevlerde işe yarıyor.

Değiştirilebilme kavramı açısından üç tür nesne var:

- değiştirilebilen
- immutable: programın yaşamı süresince değişmeyen
- const: bu referans yoluyla değişmeyen (bu, immutable'dan daha kullanışlı, çünkü immutable nesneleri de kabul ediyor)

Üye işlevler, üzerinde çağrıldıkları nesneye bağlı olarak üç değişik şekilde tanımlanabilirler:

- değiştirilen nesneler için
- immutable nesneler için
- const nesneler için

Bir üye işlevi bir sınıf için yazmak istediğimizde, derleme hatası olmaması için, ve üç tür nesne ile çalışabilmesi için üç kere tanımlamamız gerekir:

class Öğrenci
{
    int[] notlar_;
 
    int[] notlar()
    {
        return notlar_;
    }
};
 
void main()
{
    auto değişebilen = new Öğrenci;
    değişebilen.notlar();
 
    immutable Öğrenci değişmez = cast(immutable)new Öğrenci;
//     değişmez.notlar();  // DERLEME HATASI
 
    const auto sabit = new Öğrenci;
//     sabit.notlar();     // DERLEME HATASI
}

Derleme hatalarının nedeni, notlar işlevinin, üyeyi değişebilen şekilde vermesidir. Onun için, bu sınıfın aynı işlevi üç kere tanımlaması gerekir:

class Öğrenci
{
    int[] notlar_;
 
    int[] notlar()
    {
        return notlar_;
    }
 
    immutable(int[]) notlar() immutable
    {
        return notlar_;
    }
 
    const(int[]) notlar() const
    {
        return notlar_;
    }
};
 
void main()
{
    auto değişebilen = new Öğrenci;
    değişebilen.notlar();
 
    immutable Öğrenci değişmez = cast(immutable)new Öğrenci;
    değişmez.notlar();
 
    const auto sabit = new Öğrenci;
    sabit.notlar();
}

Şimdi çalışır. Yeni işlevlerin satırlarının sonuna yazdığım immutable ve const, "bu işlevi bu türden nesne için çağır" anlamına geliyor.

İşte inout, üye işlevleri gereksizce üç kere yazmayı önlemek için önerilmiş. Şöyle yazmak yetiyor:

class Öğrenci
{
    int[] notlar_;
 
    inout(int[]) notlar() inout
    {
        return notlar_;
    }
};

Ama dmd 2.039 yine de şikayet ediyor; çünkü parametrelerden en az birisinin inout olmasını istiyor. Sanırım bu bir derleyici hatası. Çünkü yukarıdaki bağlantıdaki örnek bu olanağı öneren kişinin kendisi tarafından yazılmış.

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:
Sayfa:  önceki  1  2  3  4 
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-04-24, 00:28:08 (UTC -07:00)