October 17, 2012

Alıntı:

>

Salih
An itibariyle ikilemdeyim! Basit seviyorum ama basit artık benim için çok sıkıcı olmaya başladı. Ama hala karmaşık şeylerden hoşlanmıyorum. Yani orta karar bir şeye ihtiyacım var. Ama her zaman satır sayısı az olan şeylerden hoşlandığımı yinelemeliyim.

Bu bölümde yazdığımız kodları daha çok başkaları için tasarlayıp yazıyoruz ama kendimizi de geliştirmekten geri durmuyoruz. O nedenle basit yalın talebim bizim basit yalın anlayışımızdan çok, bu dil ile ilk defa karşılaşmış ve bu düzlemdeki yayınlardan faydalanarak yol almaya çalışan arkadaşlarımızın "aa, ne kolaymış" diyeceği türden bir yalınlık demeye çalışıyorum.

Bunu yapabilirsek artı değeri daha fazla çoğalır diye düşünüyorum yaptıklarımızın.

Alıntı:

>

Salih
Bence bu .min ve .max'lar sadece bir makro! Derleme anında bunların yerine karşılıkları aynen konuyor; biz tek tek koymayalım diye. Hatta makrodan da öte, işaret ettiği değiştiğinde onlarda değişiyor...

Salih biraz daha açabilir misin?

Alıntı:

>

acehreli:
Notalar yerine Nota daha iyi bir isim olabilir mi acaba? Nota.Do "do notası" anlamına geliyor. Öte yandan Notalar.Do da "notalardan do" oluyor. :) Ben yine de Nota derdim.

Nota çok daha anlamlı görünüyor.

Alıntı:

>

Salih:
(çünkü do rezerve edilmiş bir anahtar sözcük olduğu için kullanamıyoruz)

Fena halde atlamışız burayı. Tühh!

Nihayetinde ortaya çıkan program leziz açıklamalar şahane. Daha?...

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

October 17, 2012

Alıntı (mert):

>

Alıntı (Salih Dinçer):

>

Bence bu .min ve .max'lar sadece bir makro! Derleme anında bunların yerine karşılıkları aynen konuyor; biz tek tek koymayalım diye. Hatta makrodan da öte, işaret ettiği değiştiğinde onlarda değişiyor...

Salih biraz daha açabilir misin?

Bir örnek ile açıklayayım:

void main() {
 Notalar nota;
 ushort topla;

 foreach(/* oto tür */i; nota.min..nota.max)/* ~
 foreach(ushort i; 0..7)/* yukarıdakine benzer */
 {
      topla += i;
      i.write("\t");
 }
 assert(topla == 21);
}

Yukarıdaki kodda iki nokta önemli olduğunu düşünüyorum; açıklayayım:

  • Öncelikle '/* oto tür */' diye işaret ettiğim yerde kendimizin de elle müdahale edebileceğimiz özellik çok çok önemli! Hiç bir şey yazmazsak türü ikinci parametreden (sağdan) çıkarsar. O yüzden Notalar türü küme içine kadar sızar. Bunu ilk 'foreach()' başına açıklama karakterini ('//') koyarak anlayabiliriz.
    ** Ayrıca belirtmeliyim döngü içindeki iki satıra da farklı türler gidiyor. Yani enum'un sayısal karşılığı toplanırken, sonucun yazıldığı ushort'a dönüştürülüyor. Dedik ya sağdan çıkarsıyor ki ikinci satırda da enum'un bir eksiğinin yani nota.max - 1 farkının listesini alırız: 'Do Re Mi Fa Sol La '
  • Dikkat edilmesi gereken diğer nokta da '/* yukarıdakine benzer */' açıklaması; dikkat, "benzer" dedim çünkü sağdan çıkarsama olduğu için tam karşılığı aslında şu: ''foreach''(i; nota.Do..nota.Si)''

Makro demenin sebebi ise .min ve .max özelliklerinin döndürdüğü değer, bağlı olduğu veya gösterdiği değerin baş ve son elemanlarının yukarıdaki gibi yerine konması. Eğer bunları aynı şekilde elle yazsaydık ve geliştirme esnasında yeni elemanlar ekleyip çıkarsaydık derleme hatası da alabilirdik, çalışma zamanı gariplikleri de yaşardık. Çünkü kod bütünlüğü bozulmuş oluyor, tıpkı sihirli sabitler gibi.

Alıntı (mert):

>

Nihayetinde ortaya çıkan program leziz açıklamalar şahane. Daha?...

Dahası diğer arkadaşlarda çünkü bizler sıramızı saldık gibi? Sanırım üçümüz de katkı sağladık. Başta Erdem olmak üzere diğer arkadaşların da önerilerini merakla bekleyeceğim...:)

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

October 17, 2012

Alıntı:

>

Salih:
Yukarıdaki kodda iki nokta önemli olduğunu düşünüyorum; açıklayayım:

Öncelikle /* oto tür */ diye işaret ettiğim yerde kendimizin de elle müdahale edebileceğimiz özellik çok çok önemli! Hiç bir şey yazmazsak türü ikinci parametreden (sağdan) çıkarsar. O yüzden Notalar türü küme içine kadar sızar. Bunu ilk foreach() başına açıklama karakterini (//) koyarak anlayabiliriz.

    Ayrıca belirtmeliyim döngü içindeki iki satıra da farklı türler gidiyor. Yani enum'un sayısal karşılığı toplanırken, sonucun yazıldığı ushort'a dönüştürülüyor. Dedik ya sağdan çıkarsıyor ki ikinci satırda da enum'un bir eksiğinin yani nota.max - 1 farkının listesini alırız: Do    Re    Mi    Fa    Sol    La

Dikkat edilmesi gereken diğer nokta da /* yukarıdakine benzer */ açıklaması; dikkat, "benzer" dedim çünkü sağdan çıkarsama olduğu için tam karşılığı aslında şu: foreach(i; nota.Do..nota.Si)

Çok teşekkür ederim Salih, bilgi bankası gibi oldu.

Alıntı:

>

Salih:
Dahası diğer arkadaşlarda çünkü bizler sıramızı saldık gibi? Sanırım üçümüz de katkı sağladık. Başta Erdem olmak üzere diğer arkadaşların da önerilerini merakla bekleyeceğim...:)

Yok. En azından ben daha sıramı savamadım ve savmayı da düşünmüyorum açıkçası. Bir planlama yaptım gün içinde Müzikli kodumuzla uğraşırken. Aşama aşama onu geliştirmeyi düşünüyorum.
Katkılarınızı rica edeceğim ama hemen değil. Kavramı şöyle bir oturttuktan sonra değerli bilgilerinizden yararlanmayı talep edeceğim.
Hele bir kolaylayalım bakalım :-)

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

October 17, 2012

Alıntı (acehreli):

>

Dosyanın sonunda örneğin bir '\n' olsa kodlar şu hale gelebiliyor:

'kodlar: [1, 2, 3, 4, -38]'

Ve onu yazdırınca:

'DO RE MI FA cast(Notalar)-38 '

Bu satır başı karakteri klavyeden koda giriyor mu; yoksa bir metin editörü ile mi ekledik?

Alıntı (acehreli):

>

Ayrıca bir hata çeşidinin try-catch ile gözardı edilmesi bana hiç güvenli gelmiyor. Hatalı olduğumuzu hemen anlamak isteriz. Hata try-catch ile yutulursa, bunun sakıncası program işleyişi devam ettikten çok sonra farkedilebilir ve anlaşılması zorlaşır.
Peki bunun dışında bir çözüm aklımıza geliyor mu? Yoksa switch() geri dönmemiz gerekecek. Çünkü switch() ile gelen bir default: özelliği olduğu için işimizi çok kolaylaştırıyordu.

Farkında mısınız; try catch ile aslında süzme (filter) işlemi yapıyoruz. Yani enum ile eşleşmeyen değerler olduğunda hata atılıyor ve biz onları sonuç'a döndürmüyoruz. Çünkü döngüye devam etmesi gerektiğini ve diğer kayda geçiyoruz.

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

October 17, 2012

Alıntı:

>

Salih:
Bu satır başı karakteri klavyeden koda giriyor mu; yoksa bir metin editörü ile mi ekledik?

Konsol üzerinden veri okumada sorun göremedim ben. Sanırım Kod içerisinde

public void kaydet(string notalar) @property {
     auto veriler = File(this.dosya, "w");

     foreach(nota; kodla(notalar)) {
       veriler.write(nota, '\n');   //  bu biçimde bir düzenleme
     }
   }

Bir düzenlemeden bahsediyor Ali hocam

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

October 17, 2012

Alıntı (acehreli):

>

Eğer kendisi yazmadan okunamıyorsa bu kullanımda da hata vermesi sağlanabilir.

Bu yapıyı tıpkı yukarıdaki gibi kullanmak gerekecek. Çünkü daha önce kayıt edilen şarkı veri tabanından çekilip ses üretecine gönderilecek. Yoksa ilk örneğimiz klavyeden girilen değerin doğrudan ekrana yansıtılması (3 satır) gibi olacak ki dosyaya kayıt ve okuma süreçini anlamsız kılıyor.

Peki olayı biraz renklendirmek için notaları PC speaker'ına gönderebilir miyiz? Bu konuda assembly kodu araştıracağım...

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

October 17, 2012

Alıntı:

>

Salih:
ünkü daha önce kayıt edilen şarkı veri tabanından çekilip ses üretecine gönderilecek.

Salih hocam. Kodun bu aşamasını daha önceden mi tasarlamıştınız kendiliğinden doğaçlama mı gelişti diye sorsam?

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

October 17, 2012

Alıntı (mert):

>

Alıntı:

>

Salih:
ünkü daha önce kayıt edilen şarkı veri tabanından çekilip ses üretecine gönderilecek.

Salih hocam. Kodun bu aşamasını daha önceden mi tasarlamıştınız kendiliğinden doğaçlama mı gelişti diye sorsam?

Öğlen bilgisayar başında oturuyorken şöyle tavana baktım sonra yanımda duran neye (müzik aleti), dedim müzik ile ilgili basit ve etkili bir şey yapabiliriz...:)

Şimdi bakıyorum da aradan 12 saat geçmiş ve çok şey öğrenmişiz. Sanırım SDL ile bu kodu kulağımıza hitap edecek şekilde geliştirebiliriz...

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

October 17, 2012

Alıntı:

>

Salih:
Şimdi bakıyorum da aradan 12 saat geçmiş ve çok şey öğrenmişiz. Sanırım SDL ile bu kodu kulağımıza hitap edecek şekilde geliştirebiliriz...

Anladım. sdl sizlerin uzmanlık alanı ben hiç bulaşmayayım ki yükümü ölçülü dağıtarak kullanayım. Malum zamanı efektif kullanmak gerek :-)

Oldukça faydası oldu tabii bu günkü çalışmanın. Ben de teee Ankara seminerimizden beri aklımı meşgul eden bir soruna parmak basmaya zaman bulabilmiş oldum.

Ortak bir dil ile konuşmayı, kodlama standarlarına uygun kodlar yazmayı, forum'un doğal akışına müdahalede bulunmadan ders arası bölümünde yeni takipçiler için yalın ve anlaşılabilir kodlar üretme çabasını irdeledik girişimlerde bulunduk denemeler yaptık. İyi de oldu sanki :-)

Bir kaç güne kadar ben de başladığım örneği yeterli açıklamayla belli bir noktaya kadar geliştirebilirsem mutlu olacak kendimi daha iyi hissedebileceğim.

Salih'çiğim özel ricam;
Mümkün olduğunca tasarladığımız kodlara, kodun takip edilirliğini bozmadan açıklamalar eklemeye özen gösterebilirsek memnun olacağım.

Çünkü bazen soru sorabilmek için bile o koda ulaşılması gerekebiliyor. O arada da giden gidiyor zaten aklımızdan.

İyi sabahlar olsun.

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

October 17, 2012

Çok güzel bir konu oldu. :)

Araya karıştırmak istediğim bir kaç not var. Bunlara belki daha sonra değinecektiniz ve belki de değindiniz bile ama ben kaçırdım.

  • Bu noktayı Salih sonradan düzeltmiş ama ilk foreach döngüsünü int üzerinden kurup sonra cast ile tür değiştirmeye gerek yok diyecektim. Hatta, .max'ın özel olarak işlenmesinin gerekmesi ise bir talihsizlik. Yapacak bir şey de yok. enum'lar çok işe yarıyorlar ama böyle gariplikleri olmak zorunda.

  • Notalar yerine Nota daha iyi bir isim olabilir mi acaba? Nota.Do "do notası" anlamına geliyor. Öte yandan Notalar.Do da "notalardan do" oluyor. :) Ben yine de Nota derdim.

  • notayıKodla'ya da gerek yok: std.conv.to o işi de becerir: to!Notalar("Mi")

  • Kendim yazsam, aşağıdaki gibi bir durumda .open da kullanmazdım herhalde:

void dosyayaYaz(string dosya_ismi, string notalar) {
   File dosya(dosya_ismi ~ ".dat", "w");
   dosya.write(notalar);
}
  • Bu amaç için fazla karmaşık olabilir; aklıma geldi diye yazıyorum: Dosyayı satır satır okumak için .byLine var. Okunan her satırı da map'ten geçirebiliriz. Alışık olmayanlara karışık veya itici gelebiliyor ama bulunsun: :)
import std.stdio;
import std.algorithm;
import std.conv;
import std.array;

void main()
{
   auto dosya = File("deneme.txt", "r");
   int[] sayılar = dosya.byLine()              // satır satır oku
                        .map!(a => to!int(a))  // int'e dönüştür
                        .array;                // dizi oluştur
   writeln(sayılar);
}
  • toLower'ın yalnızca bazı alfabelerde doğru işleyebildiğini biliyoruz. Salih, senin gösterdiğin toLower ve toUpper ise yalnızca ASCII tablosunda geçerli.

  • File'ın yapının üyesi olup olmaması konusunda tahmin edilen görüşüm doğru. :) File, müzik kutusu kavramının bir parçası değildir. File, MüzikKutusu nesneleri oluşturulurken ve onun verileri yazılıp okunurken kullanılan bir araçtır. Şimdiye kadar anladığım kadarına bakarsak olsa olsa dosya ismi MüzikKutusu'nun üyesi olabilir... gibi geliyor... :) Eğer MüzikKutusu nesnelerinden çok sayıda olacaksa büyüklüklerinin bir de File kadar artmasını istemeyiz.

  • Deneyim konusunda çok haklısınız. Daha önce de konuştuk: Ne kadar yazılsa ve söylense de insanın kendi yaşayarak ve yanılarak öğrenmesi gibisi yok.

  • Evet, bunları Salih bir yazı dizisi gibi yazsın ama her zaman için kodları basit tarafından alsın. :)

  • Evet, File C'den beri bildiğimiz FILE* türünü sarmalar. (Encapsulation'ın karşılığı olarak "sarma" demiştik. Kitapta da öyle geçiyor; bence devam... ;))

http://ddili.org/ders/d/sarma.html

Ali

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