Jump to page: 1 2
Thread overview
Dosyaya bayt yazmak
Jan 31, 2012
zafer
Feb 01, 2012
zafer
Feb 02, 2012
zafer
Feb 02, 2012
Salih Dinçer
Feb 02, 2012
zafer
February 01, 2012

Son günlerde diğer konulardan bu projemi hep unutmuşum, şu adreste http://ddili.org/forum/thread/689 bir mp3 dosyasından bilgileri okumayı sizlerin yardımıyla başardım. Şimdi amacımım bilgilerde değişiklik yapıp tekrar mp3 dosyasına yazmak yani bilgileri düzenleme becerisini kazanmak. Ben şöyle birşeyler yazdım ama malesef çalışmadı.

	static void yaz(ID3v1Pakedi paket, File dosya)
   {
       //scope(exit) dosya.seek(dosya.tell(), SEEK_SET);
       dosya.seek(-cast(long)ID3v1Pakedi.sizeof, SEEK_END);

       ID3v1Pakedi[1] paketler;

		paketler[0] = paket;
       dosya.rawWrite(paketler);
   }

Bu kod şu hatayı verdi;

Alıntı:

>

PS C:\Users\Zafer\Documents\Projects\Mp3Test\Mp3Test> dmd -w .\main.d
PS C:\Users\Zafer\Documents\Projects\Mp3Test\Mp3Test> .\main.exe
object.Exception@src\rt\arraycat.d(31): lengths don't match for array copy

427CEC
427B63
4071E4
407228
406E1F
4A396D

PS C:\Users\Zafer\Documents\Projects\Mp3Test\Mp3Test>

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

February 01, 2012

Bence hata yazma işleminde değil de, yazmadan önce pakette değişiklik yaptığın zaman ortaya çıkıyor. Şu satırla aynı hatayı alıyorum:

       etiketPaketi.başlık = "New Title";

Sağ taraf ile sol tarafın uzunlukları uymuyor. Şimdilik bulduğum en iyi yöntem şu:

import std.string;
// ...
       etiketPaketi.başlık = leftJustify("New Title",
                                         ID3v1Pakedi.başlık.length, '\0');

Bir önerim daha var: Pakedi dosyadan okuyan işlevi static yapmamızın nedeni, o işlevi üzerinde işletecek nesnemizin bulunmamasıydı. Nesneyi dosyadan okuyarak oluşturacağımız için şunu yapamazdık:

   nesne.oku(/* ... */);

Çünkü daha ortada nesne yoktu. Onun için türün bir static işlevi olarak şöyle yazdık ve onun oluşturduğu nesneyi dönüş değeri olarak elde ettik:

   auto etiketPaketi = ID3v1Pakedi.oku(/* ... */);

Yazmada ise durum farklı: Elimizde zaten yazacak bir nesne var. Onun için yazan işlevi normal bir üye işlev olarak düşünebiliriz. Böylece senin ilk parametre olarak 'ID3v1Pakedi paket' göndermen de gerekmez; çünkü paket zaten bu nesnedir (yani 'this'). Hijyenik ;) olarak işlevi const olarak da işaretlersek:

struct ID3v1Pakedi
{
// ...

   void yaz(File dosya) const
   {
       dosya.seek(-cast(long)ID3v1Pakedi.sizeof, SEEK_END);
       dosya.rawWrite([ this ]);
   }
}

Ayrıca dizi değişkeni de oluşturmadan kısaltınca da güzel durdu! :-p Şimdi şöyle çağrılabilir:

       etiketPaketi.başlık = leftJustify("New Title",
                                         ID3v1Pakedi.başlık.length, '\0');

       etiketPaketi.yaz(/* ... */);

Ali

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

February 01, 2012

Alıntı (acehreli):

>

Elimizde zaten yazacak bir nesne var. Onun için yazan işlevi normal bir üye işlev olarak düşünebiliriz.

Onu biraz daha düşündüm. Yazdığım fikir akla yatkın, çünkü nesne yönelimli bir çözüm oluyor. Nesneye kendini şu dosyaya yaz diyoruz.

Ama başka bir açıdan bakınca, yazma işlevinin nesne ile pek ilgisi olmadığını görüyorum. Örneğin nesnenin hiçbir üyesini kullanmıyor. Nesne bit düzeyinde toplu halde yazdırıldığı için aynı işlemin dışarıdan yapılması da bana mantıklı gelmeye başladı. Onun için zafer'in ilk gösterdiği yaz() arayüzü de çok mantıklı:

void yaz(ID3v1Pakedi paket, File dosya)

Ali

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

February 02, 2012

Ali, teşekkürler benim basit sorumu yine nefis bilgilerle donatmışsın :)

Senin kendi yazdığın kodları bu şekilde irdelemene hayranım, bu alışkanlığı bende edinmeyi çok istiyorum. Bunun için özel bir yöntemin var mı, yoksa kazandığın tecrübeler sonucu edinilen bir alışkanlık mı?

Ali malesef kodu yine çalıştıramadım. :blush: Düzenledğim kodu ve hata çıktısını aşağıya ekliyorum.

import std.stdio;
import std.string;
import std.exception;
import std.conv;

struct ID3v1Pakedi
{
   char[3]  TAG;           // "TAG" belirteci
   char[30] başlık;        // title
   char[30] sanatçı;       // artist
   char[30] albüm;         // album
   char[4]  yıl;           // year
   char[30] mesaj;         // comment
   char[1]  tarz;          // genre

   string toString() const
   {
       return to!string(başlık);
   }

   static ID3v1Pakedi oku(File dosya)
   {
       //scope(exit) dosya.seek(dosya.tell(), SEEK_SET);
       dosya.seek(-cast(long)ID3v1Pakedi.sizeof, SEEK_END);

       ID3v1Pakedi[1] paketler;
       dosya.rawRead(paketler);

       ID3v1Pakedi paket = paketler[0];

       enforce(paket.TAG == "TAG",
               format("'%s', bir ID3v1 dosyası değil!", dosya.name()));

       return paket;
	}

//	static void yaz(ID3v1Pakedi paket, File dosya)
//    {
//        //scope(exit) dosya.seek(dosya.tell(), SEEK_SET);
//        dosya.seek(-cast(long)ID3v1Pakedi.sizeof, SEEK_END);
//
//        ID3v1Pakedi[1] paketler;
//
//		paketler[0] = paket;
//        dosya.rawWrite(paketler);
//    }

	void yaz(File dosya)
   {
       dosya.seek(-cast(long)ID3v1Pakedi.sizeof, SEEK_END);
       dosya.rawWrite([ this ]);
   }
}

void main()
{
	string dosyaYolu = "C:\\Users\\Zafer\\Documents\\Projects\\Etiket\\Etiket\\veri\\Fading.mp3";

	File dosya = File(dosyaYolu, "r");

	ID3v1Pakedi paket;

	paket.başlık = leftJustify("New Title", paket.başlık.length, '\0');

	paket.yaz(dosya);

	//ID3v1Pakedi.yaz(paket, dosya);

	//writeln(paket);
}

Derleme esnasında bir hata yok, program çalıştığında ise şöyle bir hata veriyor.

Alıntı:

>

PS C:\Users\Zafer\Documents\Projects\Mp3Test\Mp3Test> dmd -w .\main.d
PS C:\Users\Zafer\Documents\Projects\Mp3Test\Mp3Test> .\main.exe
std.exception.ErrnoException@C:\DLang\dmd2\windows\bin....\src\phobos\std\stdio.d(521): Wrote 0 instead of 1 objects of type ID3v1Pakedi to file `C:\Users\Zafer\Documents\Projects\Etiket\Etiket\veri\Fading.mp3' (No error)

42C73C
42C5B3
402876
4021B3
4022C0
40B340
40B384
40AF7B
4A4F29

PS C:\Users\Zafer\Documents\Projects\Mp3Test\Mp3Test>

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

February 02, 2012
S leftJustify(S)(S s, size_t width, dchar fillChar = ' ') @trusted
   if(isSomeString!S)
{
   alias typeof(S[0]) C;

   if(cast(dchar)(cast(C)fillChar) == fillChar)
   {
       immutable len = s.walkLength();
       if(len >= width)
           return s;

       auto retval = new Unqual!(C)[width - len + s.length];
       retval[0 .. s.length] = s[];
       retval[s.length .. $] = cast(C)fillChar;
       return cast(S)retval;
   }
   else
   {
       auto dstr = to!dstring(s);
       if(dstr.length >= width)
           return s;

       auto retval = new dchar[](width);
       retval[0 .. dstr.length] = dstr[];
       retval[dstr.length .. $] = fillChar;
       return to!S(retval);
   }
}

Ben yani leftJustify bir şablon metoduyum ve S isimle bir tip üzerinde işlemler yaparım. Beni çalıştırmak istersen öncelikle bana S tipinde bir s degeri, size_t tipinde bir width değeri ve dchar tipinde bir fillChar değeri göndermek zorundasın ama senin için küçük bir kolaylık olması açısından ben fillChar değerini varsayılan olarak boşluk ayarlıyorum. Eğer sen bir fillchar değeri göndermezsen bunu kullanacağım, haberin olsun!

Alıntı:

>

if(isSomeString!S) bu satırın açıklamasını Ali'ye sor!

Alıntı:

>

alias typeof(S[0]) C;

Aslında ben bana gönderilen S tipinin temelde bir karakter katarı olduğunu biliyorum ve bu bilgiden faydalanarak ve katarın ilk elemanından tip bilgisini alıp bu tipin adına C diyorum.
'-> Burada bir soru S'nin bir string olduğunu biliyorsak neden açıkca string tanımlamıyoruz?'

Alıntı:

>

if(cast(dchar)(cast(C)fillChar) == fillChar)

Şimdi bir sınama yapıyorum. fillChar değişkenimi önce tanımladığım C tipine sonra tekrar dchar tipine çevirip elde ettiğim değerin fillChar'a eşit olup olmadığını kontrol ediyorum.
'-> Bunu neden yaptık anlamadım. Sanırım fillChar'ın standart char olup olmadığnı test ediyoruz.'

Alıntı:

>

immutable len = s.walkLength();

Eğer eşitse, kesinlikle değiştirmeyeceğimi kabul ettiğim bir len değişkeni tanımlıyor ve program çalıştığı sürece göstereceği değeri kendisine bildiriyorum. Bunu yaparken bana iletilen s değişkeninin walkLength() niteliğinden yardım alıyorum.!! Sanırım !! bu metot bana s değerimin uzunluğunu veriyor.
'-> walkLength niteliğine ulaşamadım range modülünde bir walkLength buldum ama bu daha farklı gibi nerededir bu walkLength tanımı ve ne iş yapar acaba?'

Alıntı:

>

if(len >= width) return s;

Şimdi bir sınama daha yapmalıyım, eğer bana gönderilen s değerinin uzunluğu olarak bildiğim len değeri bana çalışmam için gönderilen uzunluk olan width değerinden büyükse, yani benim çalışma için belirlenen alan zaten değişkenin tamamı tarafından kapatılmışsa, bu durumda benim yapabileceğim bir iş yok, o zaman işlemi bitirip tatile çıkalım, benden sonuç bekleyenlere de bana gönderdiklerini iade edeyim :)

Alıntı:

>

auto retval = new Unqual!(C)[width - len + s.length];

Off çok tembelim ama ne yapayım çok iş var. Şu retval değişkeninin tipini auto yapayımda birde onla uğraşmayayım. Bu retval ile güzel işler yapacağım en iyisi bellekte bir yer ayarlayıp onu oraya yerleştireyim hemde gözümün önünde olur :) ama bir sorun var C olarak bildirdiğim tip üzerinde ya başka işaretler varsa bana tipin saf, temiz hali gerekiyor o zaman önce şu Unqual şablon metodunu çağırıp şu tipi bir temizleyelim sonrada gerekli hesaplamayı yapıp bellekte bir yer ayarlayıp retval'a vereyim.
'-> [width - len + s.length] burada len zaten s.length ise fazladan işlem yapılmış gibi?'

Alıntı:

>

retval[0 .. s.length] = s[];

Hımm. retval değişkenim hazır olduğuna göre şimdi bana gönderilen karakter katarını bu değişkene aktarayım. D'nin kestirme yollarını seviyorum [] işleci sayesinde dizinin tamamını tek bir hamlede aktarabildim.

Alıntı:

>

retval[s.length .. $] = cast(C)fillChar;
return cast(S)retval;

Şimdi ise retval değişkeninin geriye kalan kısmını doldurayım. Evet artık hazır son olarak retval'ı gelen tipe çevirip geri göndereyim.
'-> Burada Unqual ile yapılan temizleme işlemini tam anlamadığım için bu kısımda askıda kaldı ?'

Metodun kendisini tanıttığı tarzda bir yazı hazırlamaya çalıştım, tabi ki amacım D bilgim ile böyle bir metodu anlamaya çalışmaktı. Başlangıçta keyifli ve basit bir iş gibi görünsede ilerleyen satırlarda ve başka metodlara dallandıkça çok zor ve emek isteyen bir iş olduğunu anladım. Bu sebeple else kısmını atladım :) Hikayeye devam etmek isteyenler tamamlayabilir.

Diğer taraftan böyle bir çalışmanın ne kadar öğretici olduğunuda anlama fırsatı buldum. immutable, Unqual, [] gibi daha önce geçmiş tarimleri tekrar hatırladım walkLength gibi yeni niteliklerle tanıştım. Değişik bir tarz olduğunu söylemeliyim belki bir toplulukla daha etkileyici bir deneyim olabilir.

Sorular alttaki mor satırlarda, eksik ve yanlışlarımıda düzeltirseniz memnun olurum.

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

February 02, 2012

Alıntı (zafer):

>
> ...
> 	if(cast(dchar)(cast(C)fillChar) == fillChar)
> 		...
> 		auto retval = new Unqual!(C)[width - len + s.length];
> 		...
> 		retval[0 .. dstr.length] = dstr[];
> ...
> ```

> Metodun kendisini tanıttığı tarzda bir yazı hazırlamaya çalıştım, tabi ki amacım D bilgim ile böyle bir metodu anlamaya çalışmaktı. Başlangıçta keyifli ve basit bir iş gibi görünsede ilerleyen satırlarda ve başka metodlara dallandıkça çok zor ve emek isteyen bir iş olduğunu anladım. Bu sebeple else kısmını atladım :) Hikayeye devam etmek isteyenler tamamlayabilir.
Off, çok karışık! Yani anlatım değil de (çünkü çok leziz görünüyor!) yukarıda alıntıladığım satırlara odaklanmıyorum...:(

Alıntı (zafer):
> Diğer taraftan böyle bir çalışmanın ne kadar öğretici olduğunuda anlama fırsatı buldum. immutable, Unqual, [] gibi daha önce geçmiş terimleri tekrar hatırladım walkLength gibi yeni niteliklerle tanıştım. Değişik bir tarz olduğunu söylemeliyim belki bir toplulukla daha etkileyici bir deneyim olabilir.
Herhalde bilmediğim çok şey olduğundan böyle. Bence de bu anlatım tarzı, topluluk önünde (yüzyüze) çok güzel bir etkinlik olabilir. Özellikle Crockford'un anlatımları gibi lezzetli olacaktır. O da güzel parantez konusundaki farklı kullanımları irdelemiştir. Bir keresinde Türkiye'ye geldiğinde kendisini dinleme fırsatı bulabildim.

Araya bir de şu satır(lar)ı sıkıştırmak istedim. Ben genelde 'for''dan hemen sonra gelen 'if''lerde bile öncesine güzel parantez kullanmayıp tek satırlık for-if iş birliğini sanki tek komutmuş gibi temsil ederken sadece bir if için tek satır kullanmayıp altına girintili devam etmenizin kod yazma kolaylığı açısından sebebi nedir? <--- Farkındayım, çok uzun bir cümle oldu; işte kod yazarken sadeleştirmeye gayret ederim ama gel gör ki yazışırken uzatırım da uzatırım. Huy çıkmaz, can çıkarmış...:)

if(len >= width)
	return s;

Başarılar...

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

Alıntı (zafer):

>

Senin kendi yazdığın kodları bu şekilde irdelemene hayranım, bu alışkanlığı bende edinmeyi çok istiyorum. Bunun için özel bir yöntemin var mı, yoksa kazandığın tecrübeler sonucu edinilen bir alışkanlık mı?

Herhalde tecrübe olmalı. Kodun veya tasarımın kime ait olduğu önemli olmamalı. Aslında püf noktası şu: Her tasarımın iyi ve eksik tarafları vardır. Onun için mutlaka konuşacak şey bulunuyor. :)

Bence bir kere tasarıma karar verdikten sonra bu kadar irdelemeyi bırakabilmek daha iyi olur. :)

Bu konuda yazacaklarım bitmedi! ;) leftJustify() kullanmak zorunda kalmış olduk! Üyeleri sabit uzunluklu diziler yapmak iyi fikir miydi? Öyle oldukları için sıradan atama bile yapamadık! Düşününüz... :)

Alıntı:

>
> // ...
> 	File dosya = File(dosyaYolu, "r");
> ```

>
> [...]
>
> Alıntı:
> >
> > PS C:\Users\Zafer\Documents\Projects\Mp3Test\Mp3Test> dmd -w .\main.d
> > PS C:\Users\Zafer\Documents\Projects\Mp3Test\Mp3Test> .\main.exe
> > std.exception.ErrnoException@C:\DLang\dmd2\windows\bin\..\..\src\phobos\std\stdio.d(521): Wrote 0 instead of 1 objects of type ID3v1Pakedi to file `C:\Users\Zafer\Documents\Projects\Etiket\Etiket\veri\Fading.mp3' (No error)

Yani 1 eleman yazmak istemişiz ama 0 yazabilmiş. Dosya "r" ile açıldığı için. :) "r+" olması gerekiyor:

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

Ali

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

Alıntı (Salih Dinçer):

>

Off, çok karışık!

Bence bu işlevin çok kullanışlı olmasından kaynaklanıyor. Yoksa leftJustify'ı yalnızca ASCII karakterlerle işleyecek biçimde yazmak zor olmamalı: şu dizgiyi al, toplam şu kadarlık dizi olarak döndür; sondaki boş tarafını da şu karakterle doldur.

Not: Aslında leftJustify bu amaç için en uygun işlev de değil. Onunla ilgili olarak daha sonra yazacağım.

Alıntı:

>

yukarıda alıntıladığım satırlara odaklanmıyorum...:(

auto retval = new Unqual!(C)[width - len + s.length];

Unqual, kendisine verilen türün const, immutable, vs.'den arınmış olan temelini verir. Örneğin C 'const char' ise, Unqual!C 'char'dır. (Unqual!C ile Unqual!(C) aynı şey; çünkü tek şablon parametresi belirtiliyor.)

O türden eleman için 'width - len + s.length' adet yer bir dilim olarak ayrılıyor. Örneğin o kadar 'char' için.

retval[0 .. dstr.length] = dstr[];

dstr diye bir dilim varmış; sağ taraftaki yazım, "onun bütün elemanları" demektir. retval diye de bir dilim varmış. Onun baş tarafındaki dstr.length adet elemanına dstr'ın bütün elemanları kopyalanıyor.

Alıntı:

>

Bence de bu anlatım tarzı, topluluk önünde (yüzyüze) çok güzel bir etkinlik olabilir.

Bu yaz bu işi daha ciddi organize edelim mi? Ben Ali Karaali'nin aracılığı ile geçen sene Bahçeşehir Ünevirsitesi'nde D dilini tanıtan bir konuşma yapmıştım. Ondan önceki sene de C++ hata atma düzeneği idi.

Bu sene D üzerine bir mini seminer düzenleyelim. Tam yüz yüze anlatım olur. :) D'de anlatacak çok şey var. Teorik olduğu kadar Zafer'inki gibi incelemeler de çok güzel konu olur.

Veya küçük de olsa bir D programı... Bunu ayrı konu olarak konuşuruz.

Alıntı:

>

Araya bir de şu satır(lar)ı sıkıştırmak istedim.

Bunu bir eleştiri olarak alma lütfen ama ben her sorunun kendi konusu olmasını daha etkin buluyorum. Yoksa konular çok dallanıyorlar ve çok büyüyorlar. :) Ayrıca aşağıdaki konu kendi başlığını hakedecek kadar ilginç.

Alıntı:

>

Ben genelde 'for''dan hemen sonra gelen 'if''lerde bile öncesine güzel parantez kullanmayıp tek satırlık for-if iş birliğini sanki tek komutmuş gibi temsil ederken sadece bir if için tek satır kullanmayıp altına girintili devam etmenizin kod yazma kolaylığı açısından sebebi nedir? <--- Farkındayım, çok uzun bir cümle oldu; işte kod yazarken sadeleştirmeye gayret ederim ama gel gör ki yazışırken uzatırım da uzatırım. Huy çıkmaz, can çıkarmış...:)

> 	if(len >= width)
> 		return s;
> ```

> Başarılar...
>

Bunun kod kolaylığı açısından bir yararı yok. Olsa olsa okunaklılık açısından yararı olabilir. Programdaki diğer if'ler vs. bloklarını hep aşağıya alıyorlarsa gözümüz de kodu bakarken blokları orada ararlar. O yüzden tutarlı olmakta yarar var.

Yoksa satırın sonunda gizli kalmış oluyorlar.


if (len >= width) return s;
writeln("devam");



O kodu görünce writeln'ın if bloğu altında olduğu sanılabilir. Satırı girintili olmadığı için ise acaba boşluk mu unutuldu diye düşünülebilir. Tekrar if'e bakılır ve bloğunun aslında kendi satırında olduğu görülür.

Tutarlılık çok önemli olduğu için kendi adıma her zaman için küme parantezlerini de kullanırım:


if (len >= width) {
return s;
}



Sonradan başka satır eklenecekse yeri hazırdır. Öteki türlü, return s aşağıya indirilmelidir.

Ama çok önemli değil tabii. Kişisel... :)

Ali

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

Alıntı (Salih Dinçer):

>

Araya bir de şu satır(lar)ı sıkıştırmak istedim. Ben genelde 'for''dan hemen sonra gelen 'if''lerde bile öncesine güzel parantez kullanmayıp tek satırlık for-if iş birliğini sanki tek komutmuş gibi temsil ederken sadece bir if için tek satır kullanmayıp altına girintili devam etmenizin kod yazma kolaylığı açısından sebebi nedir?

Öncelikle bu metodu yani leftJustify metodunu kim yazdı bilmiyorum ama ben yazmadım :) Ali 'ninde yazdığı gibi bu biraz kişisel tercihlerle ilgili bir mesele, benim tercihim ise her zaman süslü (güzel) parantezler kullanmaktan yana ve açma ve kapatma parantezlerini yeni satırdan başlatma eğilimindeyim.Yani benim yazdığım kod şöyle olurdu.

for (int i = 0; i < 5; ++i)
{
	if (i == 3)
	{
		writefln("Döngünün %s.adımını işliyorum.", i);
	}
}

Alıntı:

>
> auto retval = new Unqual!(C)[width - len + s.length];
> ```

>
> Unqual, kendisine verilen türün const, immutable, vs.'den arınmış olan temelini verir. Örneğin C 'const char' ise, Unqual!C 'char'dır. (Unqual!C ile Unqual!(C) aynı şey; çünkü tek şablon parametresi belirtiliyor.)
>

Buradan anladığım kadarıyla aslında bu kod satırı şuna eşit, yanlışım yoksa tabi.


import std.stdio;
import std.string;
import std.range;
import std.traits;

void main ()
{
string s = "deneme";
int width = 10;
int len = s.walkLength();

alias typeof(s[0]) C;

//auto retval = new Unqual!(C)[width - len + s.length];

//auto retval = new string[width - len + s.length];

//auto retval = new string[10];

string[] retval = new string[10];

writeln("retval : ", retval.stringof);

}



Bu şekilde daha anlaşılır oldu. Aslında yapılan iş basit bir string dizisi tanımlamak ama bende Salih gibi o satırı ilk gördüğümde neresinden çözmeye başlayacağımı bile anlamamıştım :) Tabi bu kodun ardından şu klasik cümleyide eklemek istiyorum. **Aslında her şey basit ve küçük parçalardan oluşan yapılardır.**

Alıntı:
>
> Bu yaz bu işi daha ciddi organize edelim mi? Ben Ali Karaali'nin aracılığı ile geçen sene Bahçeşehir Ünevirsitesi'nde D dilini tanıtan bir konuşma yapmıştım. Ondan önceki sene de C++ hata atma düzeneği idi.
>
> Bu sene D üzerine bir mini seminer düzenleyelim. Tam yüz yüze anlatım olur. :) D'de anlatacak çok şey var. Teorik olduğu kadar Zafer'inki gibi incelemeler de çok güzel konu olur.
>
> Veya küçük de olsa bir D programı... Bunu ayrı konu olarak konuşuruz.
>

Aslında böyle bir takım aktiviteler ne zamandır benimde aklımda ama sen kendin gönüllü olarak onay vermeden ben yazmak istemedim. Türkiye'ye geldiğin kısıtlı zaman için şimdiden güzel bir planlama yaparak bu zamanı en iyi şekilde değerlendirebiliriz diye düşünüyorum. Bu konuyu başka bir başlık altında tüm forum katılımcıları ile irdelemek daha doğru olur bence.

Ali, mesajların içerisinde bazı sorulara cevap vermişsin ama önceki mesajımdaki soruları mor renk ile işaretlemiştim, eğer fırsat bulabilirsen onlarada cevap yazarsan çok sevinirim.

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

Alıntı (zafer:1328177701):

>

Sorular alttaki mor satırlarda, eksik ve yanlışlarımıda düzeltirseniz memnun olurum.

Onlara bakacak zaman bulamadım. Yakında... :)

Ali

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

« First   ‹ Prev
1 2