January 17, 2010

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.)
  5. Veri tabanı silinebiliyor. (İçinde tablo varsa silinmez)
  6. sil() işlevi ile belirtilen dosya yada dizin(alt dizinleri ile birlikte.) silebiliyor.
  7. 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.).
  8. Belge eklendi.
  9. 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 gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

January 17, 2010

Bu konuda daha önce de karışıklık olmuştu. Eğer Windows'da isen, dmd/windows/bin'in altında da bir make var. O, Digital Mars'ınki... Belki o çalışıyordur ve emin değilim ama belki o dosya ismini şart koşuyordur. (?)

Ben klasik, özel bir şey yapmadan GNU make'i kullanıyorum.

Ali

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

January 18, 2010

Alıntı:

>

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

Alıntı:

>

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

ve Alıntı:

>

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.

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

January 18, 2010
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 ?

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

January 18, 2010

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.

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

January 17, 2010

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

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

January 18, 2010

Alıntı (canalpay):

>

Bu arada projeden son durum :

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

Alıntı:

>

Şuan yapabildikleri:

Çok kapsamlı! :)

Alıntı:

>

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.

Alıntı:

>

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. (?)

Alıntı:

>

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

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

Alıntı:

>

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

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

Onu da paralel olarak götürebilirsin.

Ali

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

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

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

January 18, 2010

Alıntı:

>

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.(?)

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

January 18, 2010

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

Alıntı:

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

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