January 19, 2010

Alıntı (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

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

January 19, 2010

Alıntı (canalpay):

>

Alıntı:

>

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.

Alıntı:

>

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.

Alıntı:

>

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

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

Ali

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

January 19, 2010

Alıntı (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.

Alıntı:

>
  1. 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. :)

Alıntı:

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

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

January 20, 2010

Alıntı:

>

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:
Alıntı:

>

"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 ?

Alıntı (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 :-) )

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

January 20, 2010

Alıntı (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;

Alıntı:

>

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

Evet, onu demek istemiştim.

Alıntı:

>

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ı? :) )

Alıntı:

>

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.

Alıntı:

>

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

Alıntı:

>

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:
Alıntı:

>

"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.)

Alıntı:

>

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.

Alıntı:

>

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.

Alıntı:

>

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

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

January 25, 2010

Alıntı (acehreli:1262571002):

>

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.php?art_group=digitalmars.D&article_id=105177

'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

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

1 2 3 4 5 6
Next ›   Last »