C# String Format ve İnitializer Kullanımı

Nisan 19, 2017 Mustafa BÜKÜLMEZ 0 Yorum

Bu derste C# String Format ve İnitializer Kullanımını göreceğiz


Selamlar arkadaşlar,
Bu dersimizde String.Format ve Initializer kullanım şekillerini göstermeye çalışacağım. Kullanım şekilleri kısmına dikkat!!.
Evet arkdaşlar kullanım şekillerinden kastım; bu bir kod veya komut vs. şeyler değil dünyaca kabul görmüş kod yazım şeklidir. 
(Aslında String.Format bir metod ama onu kullanmadan da gerekli işlemi yapabiliyoruz.)
1 - String.Format:
C#
string Query = "Select * from STOKLAR where stk_Grp = '" + txt_StokGrup.Text + "'";
Normalde bu şekilde bir string değişkene bu şekilde tanımlama yapıyoruz. Ancak bu standartlara uygun değil. Standartlara uygun yazım şekli aşağıdaki gibidir.
C#
string Query = String.Format("Select * from STOKLAR where stk_Grp = '{0}'", txt_StokGrup.Text);
String değişkene dışarıdan veri ekleyeceksek, 
1. örnekte olduğu gibi yapabiliyoruz ancak zamanla bu yöntem daha karışık bir hal alabiliyor. 
2. Örnekte olduğu gibi de yapabiliyoruz. İkiside aynı kapıya çıkıyor. Ancak göz attığınızda farkettiğiniz gibi okuması ve anlaşılması daha kolay bir yöntem.
Birbirlerine karşı başka ne avantajı var bilmiyorum. Belki 2. yöntem daha güvenli ve performanslıdır.
2 - Initializer 
Bu yöntemi genellikle form çağırırken kullanırız. Hemen eski yöntemi görelim.
C#
PersonelGuncelleme fr = new PersonelGuncelleme();
fr.Personel_ID = PersonelID;
fr.Personel_Kodu = PersonelKodu;
fr.ShowDialog();
Form tanımlanır. Forma gönderilecek veriler gönderilir ve From çağırılır. Diğer yöntemde de mantık anyı ancak yazım şekli daha farklı, okunaklı ve güzel :)
C++
PersonelGuncelleme fr = new PersonelGuncelleme()
{
   Personel_ID = PersonelID,
   Personel_Kodu = PersonelKodu
};
fr.ShowDialog();
Şöyle baktığımızda aslında 2. yöntem hem göze hitap ediyor hemde daha okunaklı. Bunu sadece Form çağırırken değil başka yerlerde de kullanabiliriz.
Örn. bir mail gönderme class'ında
C++
//eski
SmtpClient smtp = new SmtpClient("ServerHost", ServerPort);
smtp.UseDefaultCredentials = false;
smtp.EnableSsl = true;
smtp.Credentials = cred;

//yeni
SmtpClient smtp = new SmtpClient("ServerHost", ServerPort)
{
   UseDefaultCredentials = false,
   EnableSsl = true,
   Credentials = cred
};
Bu şekilde olan tüm kodlarınızda bu yöntemi kullanabilirsiniz. 
C#
SmtpClient smtp = new SmtpClient(String.Format("{0}.com",ServerAdi), ServerPort)
{
   UseDefaultCredentials = false,
   EnableSsl = true,
   Credentials = cred
};
Bu dersimizde bu kadar arkadaşlar, Diğer derslerimizde görüşmek üzere.
Bol Kodlu Günler.
https://mustafabukulmez.com/
  • Etiketler;
  •  
  • c#
  •  
  • c sharp
  •  
  • string.format
  •  
  • initializer

0 Yorum:

MS-SQL (CAST) Sanal Kolon Oluşturmak ve Kullanmak (C#)

Nisan 19, 2017 Mustafa BÜKÜLMEZ 0 Yorum

Bu dersimizde ms-sql de bir sanal kolon oluşturup bu kolonla C# üzerinde nasıl işlem yaparız ona bakacağız


Selamlar arkadaşlar,
Bu dersimizde ms-sql de cast komutu ile bir sanal kolon oluşturup o sanal kolon ile nasıl işlem yapacağımızı anlatmaya çalışacağım.
Cast komutu aslında bir sanal kolon oluşturmamıza olanak sağlıyor ama aynı zamanda bir kolonun tipinide değiştirebiliyoruz. int olarak ayarladığımız bir kolonu select sorgusu içersinde cast komutu ile nvarchar olarak değiştirebiliriz. Bunu da sanal kolon mantığı ile yapıyoruz.
Cast ile sanal bir nvarchar kolon oluşturup int olan kolonu o sanal kolonun içerisinde atıyoruz. (anladığım kadarı ile...)
Kendi kullanım seklimi analtacağım. Sizler işinize nasıl yarıyorsa o şekilde kullanabilirsiniz.
SQL
selecet

 CAST(0 AS bit) as SEÇ

,*
from STOKLAR
Yukarıdaki kodumuz bize değeri 0 (False) (Seçilmemiş/Boş) olan BIT türünde sanal bir kolon oluşturuyor. Program içerisinde bu select sorgunu bir grid e bastığımız da SEÇ kolonunda checkBox ile geliyor. (DevExpress Nesnesinde) Ve bizde bu seçim alanını kullanarak kullanıcıya çoklu işlem yaptırabilliyoruz.
Şimdi C# kodlarımıza bir bakalım.
C#
for (int i = 0; i < gridView1.RowCount; i++)
{
  string SEC = Convert.ToString(gridView2.GetRowCellValue(i, "SEÇ").ToString());
  if (SEC == "True")
  {
    // işlem kodlarınız.
  }
}
Bu şekilde de C# içerisinde SEÇ adlı BIT türündeki kolonda seçilmiş olan kayıtlar üzerinde işlemler yapabiliriz. (Örn, Seçili siparişleri onaylamak/iptal etmek gibi.)
Bu dersimizde bu kadar arkadaşlar.
Bol Kodlu Günler.
------------------------------------------------------------------------------------------------------------ 
NOT: Ben sürekli DevExpress kullandığımdan verdiğim kodları Windows nesnelerinde çalışmayabilir. Bu sebeple yazdığım kodlar size işin mantığını göstermek ve fikir vermek amaçlıdır. DevExpress kullanıyosanız kodları projenize göre düzenleyerek kullanabilirsiniz.
https://mustafabukulmez.com/
  • Etiketler;
  •  
  • ms-sql
  •  
  • c sharp
  •  
  • sql cast kullanımı
  •  
  • sanal kolon

0 Yorum:

MS-SQL (CAST) Sayının Virgülden Sonra İstenen Kane Kadar Gösterilmesi

Nisan 19, 2017 Mustafa BÜKÜLMEZ 0 Yorum

Bu dersimizde sql de Sayının Virgülden Sonra İstenen Kane Kadar Gösterilmesini anlatıyorum


Selamlar arkadaşlar,
Bu dersimizde sql de cast komutunu kullanarak bir sayıda virgülden sonra istenen hane kadar sayı gösterilmesini dersini anlatmaya çalışacağım.
Hemen komutu anlatayım. Bu komut aslında bize sanal bir kolon oluşturmamızı da sağlar ama bu dersimizde bir sayıda virgülden sonra istenen hane kadar sayı gösterilmesi işlemini yapacağız.
SQL
select 

CAST(Tutar as DECIMAL(15,3)) as Tutar

from STOKLAR
Yukarıda gördüğümüz gibi arkadaşlar işlem bu kadar. (15,3)  ibaresindeki 3 virgülden sonra kaç basamak olacağını belirtmektedir.
Bu dersimizde bu kadar arkadaşlar. Bir sonraki dersimizde görüşmek üzere.
Bol kodlu günler.
https://mustafabukulmez.com/
  • Etiketler;
  •  
  • mssql
  •  
  • virgülden sonra hane
  •  
  • sql cast kullanımı

0 Yorum:

Yazılıma Başlamadan Önce Sindirmeniz Gereken 6 Madde

Nisan 19, 2017 Mustafa BÜKÜLMEZ 0 Yorum


Bu dersimizde kendi tecrübelerimden yola çıkarak yazılım sektörüne girmek isteyen arkadaşlara tavsiyler bulunmaktadır.

Selamlar arkadaşlar,
Bu dersimizde kendi tecrübelerimden yola çıkarak sizlere nacizane tavsiyeler vermek istedim. Umraım faydası dokunur.
1 - Araştır, araştır ve araştırmayı sev;
Araştırma yapmadığın sürece kendini geliştirmen imkansız. Yazdığın kod çalışıyor diye sorun yok şeklinde düşünmek çok yanlış. Bol bol araştırma yap, araştırmayı sev.... Kendini geliştir, kodlarınız geliştir, yazım tekniği geliştir. Yeniliklerden haberdar ol. Yeni şeyler denemekten korkma. 
2 - Yaz sil, yaz sil, yaz sil;
Genelde bir yazılımcı işe çok kod yazarak başlar. Onlara diyecek bir sözümüz yok tabi bizde en başta aynı kodu tekrar tekrar ve uzun uzun yazıyorduk. Ancak örneğin ben hiçbir zaman formun içerisinde sql connection string yazmadım. Üniversitede proje ödevi olarak bir asp.net site yaparken izlediğim eğitim setinde adam direk sql connection class ve diğer class hazırlama işlemlerini de göstermişti. Bu yüzden direk classlar ile çalışmaya başladım. Ve inanın proje bitiş süresini inanılmaz etkiliyor. O ilk sql class yorum satırları ile birlikte 205 satırdı. Şuan da ise yorum satırları dahil 63 satır. Peki bu nasıl oluyor?. İşte yaz sil, yaz sil, yaz sil burada ortaya çıkıyor. Yazıyorsun sonra bakıyorsun  işe yaramayan yerler var siliyorsun. Yazıyorsun sonra bakıyorsun buraları şöyle birleştirsem yine aynı şey olur diyip siliyorsun. Yeni birşey öğreniyorsun onu eklemek için silip yazıyorsun. Kodları artık ihtiyaçlarını karşılamıyor araştırıp öğreniyorsun silip yazıyorsun. Hatta bazen tamamen silip yeniden yazıyorsun. Ve kodların daha kısa ve anlaşılır oluyor. Hatta  3 4 yıl sonra ilk projelerine bakıp kendine küfür edebiliyorsun. Ben burada ne yapmışım looooo diyorsun kendi kendine: Ara sıra ilk yazdığım projelere geri dönüp bakıyorum "bu ne la" diyip siliyorum, "ne yazmışım la burada" diyip siliyorum. Ve inanın sile sile projedeki kodların yarısından fazlasını silmişim ve hala siliyorum.
3 - Önce düşün sonra yaz;
Yazılımcı olmak istiyorsanız düşünce şeklinizi bir düzene sokmalısınız. Analitik düşünmek gibi şeylerden bahsetmeyeceğim. Öyle üstün matemetik bilmenize de gerek yok. Size lazım oln formülleri ihtiyacınız olduğunda zaten mecburen öğreneceksiniz. Bu yüzden kasenizi şimdiden bunlarla doldurmaya gerek yok. Elbette zaten biliyorsanız ne ala! Matematik bilmenin hiçbir zaman kötüsü olmaz. Ne kadar çok biliyorsanız bilmem kaç sıfır önce başlarsınız ama matemetik bilmeyen programcı olamaz diyenleri zerre takmayın. Yazılım işi gönül işi gibidir. Matematik profesörü olsanızda sevmediğiniz takdirde yapamazsınız.  (Yalan söylemiyorum ben daha geçen seneye kadar çarpım tablosunu bile ezbere bilmiyordum.) Bilmeniz ilk şey gereken şey işlem önceliği. İlk olarak bunu öğrendiyseniz şimdilik yeter. Kaldı ki bu sadece matematik sorularında değil bu sektörün kendisinde vardır. 
      Sırası ile
      1 - Düşün.
      2 - Soru sor.
      3 - Tekrar düşün.
      4 - Kafanda soru işareti kalmayana kadar soru sor.
      5 - Kafanda projeyi (mümkünse son haline kadar) tasarla - Gerekirse kağıt kalem al yaz çiz.
      6 - Kullanacağın formları kafanda çizdiğin tasarıya göre tasarla
      7 - Kodlarını yazmaya başla. (Database tablolarını hazırlamakta bu aşamada).
                Ben from tasarımlarını yaptıktan sonra tabloları açma taraftarıyım. Çünkü yaptığım tasarımı kafamda ilgili her yere bağlıyorum. İlişkilendirmelerini ayarlıyorum. Sonra tablolarını açmaya başlıyorum. Elbette gözden kaçan şeyler olmuyor değil ama en azından geri dönüş süreci minimum seviyede oluyor.
Şimdi böyle bir sıralama ile başlamazsan ve devam etmezsen o projenin büyük ihtimalle sonu gelmeyecektir. "Yaw hele bir başla sen, aklımıza geldikçe söyleriz eklersin" diyerek işe başlamanı isteyen bir müşteri üç beş kuruşa kendi kafasındaki mükemmel programı sana yazdırmaya çalışacaktır. Tecrübe ile sabittir. Üç yılda zar zor bitirebildiğim bir proje olmuştu. Tahmini altı yedi ay gibi bir sürede bitebilirdim.
4 - Basit düşün;
İnsanlar basit şeyleri severler. Bir formdan gir ona tıkla, oradan çık şuraya gir şunu tıkla, şurdan da şuna tıklarsan istediğin olur dersen bir adama, adam mala bağlar "yaw bu seferlik sen yapta bende bakıp öğreneyim" der. Sonra bir bakmışsın herkes o raporu senden ister olmuş. Sana göre çok basittir. "Yahu bunde ne var ki?" dersin ama müşteri anlamayabilir. O yüzden yapabildiğin en basit halinde yapman gerekir. 
            Unutma o projeyi sen yazdığın için ve neyin nerede olduğunu çok iyi bildiğin için sana çok basit gelmesi gayet normaldir.
           "Dünya üzerindeki en düşük IQ ya sahip bir insanın bile anlayacağı şekilde yap." bu benim bu konudaki felsefemdir. Yardım dosyalarını hazırlarken, Kullanım klavuzu hazırlarken ve programı yazarken hep bu felsefe ile yazarım. En temel anlamı da "Basit Düşün" dür.
5 - Az kod çok iş;
Yazılımcıların bazıları yazdıkları kod satırı sayısı ile hava atarlar. "Çok iyi yaa bugün 10.000 satır kod yazdım. Varmı benden hızlısı" diyen bir tanıdığım vardı. Benim gözümde onlar yazılımcı değildir. O hava atan insanlar bu işi hava atmak için yapıyorlardır. Fazla kod yazmak sadece hammallıktır. Bende kopyala yapıştır ile günde bir proje bitirebilirim. Benim mantığıma göre bir kodu / kod bloğunu iki kere yazmak hammallıktır ve o işte bir sıkıntı vardır. Hatta bırakın kodu benzer işleri yapacak bir formu bile iki kere kullanmam. Örneğin bir seçim listesi yapacaksam gelinen sayfaya göre sadece gösterilecek verileri değiştiririm. Mesela sql bağlantısı yaparken her yere connection string yazmak, bağlantı açmak/lkapatmak ve daha bir sürü kod yazmak yanlıştır.  Bunları bir class içerisine çekip genel bir hale getirdiğinizde bir kere yazar tüm projede kullanabilirsiniz. bir değişiklik yapmanız gerektiğinde classı değiştirirsiniz ve tüm proje güncel olur. Diğer türlü her formu tek tek gezmek zorundasınız.
Tabiki bu biraz tecrübeye bağlıdır. Ancak 1. maddeden buraya geldiyseniz direk aşağıdaki 4. sorudan başlamanız hiçte zor olmaz.
              * - Kod çalışıyor mu? Evet. Tamam elleme (50 satır)
              * - Kod çalışıyor mu? Evet de bu kodlar ne la. Gereksiz satırları sil. (35 satır)
              * - Kod çalışıyor mu? Evet de bu kodu yazan çocuk kör oldu. Gereksiz satırları sil. (17 satır)
                           bkz. Bu Halıyı Dokuyan Çocuk Kör Oldu
              * - Kod çalışıyor mu? Evet de aga her yerde bu kod var. Kodları bir class' a çek. (25 kullanım 25 * 17 satır )
              Son hali class içi 25 satır ve 1 satırda çağırma ( 25 * 1 ) + 25 satır = proje genelinde toplam 50 satır. 
              Proje genelinde  25 * 50(ilk hali) = 1250 satırdan 25 + 25 = 50 satıra düşürdük.
Hiç araştırma yapmayan kişi kendinden çok iyi yazılımcıların yazılarını hiç göremeyecek ve kendi yazdığı kodların on numara olduğunu düşünecek. Kodlar çalıştığı için kendini geliştirmeyecek ve böylece devam edecek. Düşünün bu kodda bir değişiklik yapmanız gerekirse? 50 yerde kullandınız tek tek oralara gidip tek tek düzelttiniz. Kaç saatinizi alacak?. Proje ilerledikçe değişiklik yapmaktan korkacaksınız ve giderek meslekten uzaklaşacaksınız.
6 - Kopyala yapıştır hiçbir şeyi çözmez;
En iyi yazılımcılar bile yeri geldiğinde kopyala yapıştır yapar. Ancak kopyalayıp yapıştırdıktan sonra geri dönüp o kodları paylaşan adama küfür veya hakaret etmez. Çünkü bilir ki o kodları kendi kodlarına uyarlaması gerekir. Hatta bazen kodların son hali kopyala/yapıştır yaptığı kodlardan alakasız bir hale gelecek ama o yazılımcı o işi öğrenmiş olacak. Çünkü kodlar üzerinde çalışacak mantığını anlayacak belki o mantığı kendi yöntemleri ile bambaşka bir şekilde sıfırdan yapacak. Dediğim gibi kopyala yapıştır hiçbir şeyi çözmez. O kodları önce sindirmelisiniz. Kendi kodlarınıza adapte etmelisiniz. Ve yine dediğimiz gibi belki de son hali alakasız olacak ama istediğiniz işi de başarmış olacaksınız. 
Şimdilik bu kadara arkadaşlar. Zamanla bu paylaşımı güncelleyeceğim.
Bol kodlu günler.


0 Yorum:

Visual Studio'da Mutlaka Bilmeniz Gereken Kısayollar (Süpriz Sonlu :) )

Nisan 19, 2017 Mustafa BÜKÜLMEZ 0 Yorum


Bu dersimizde visual studio da mutlaka bilmemiz gereken kısayolları göreceğiz.

Selamlar,
Bu dersimizde Visual Studio da mutlaka bilmemiz gereken ve yazım hızımı katlayarak arttıracak kısayolları anlatmaya çalışacağım.
F2 =  İmlecin üzerinde bulunduğu tanımın kendisine gidiyor. Değişken ise tanımlandığı alana gidiyor. Metod ise metodun kendisine gidiyor.
F5 =  Projeyi çalıştırır
F6 =  Projeyi build eder.
CTRL + PAUSE/BREAK = Build etme esnasında build işlemini iptal eder. 
CTRL + ALT + F7 = Build işlemini iptal eder.
F9 =  İmlecin bulunduğu satıra BreakPoint atar.
F10 = Kodları izlerken metodların içerisinde girmeden devam eder.
F11 = Kodları izlerken metodların içerisinde girerek devam eder. (Tüm adımları takip etmek için.)
SHIFT + F5 = Debug Modunu durdurur.
CTRL + ENTER = İmlecin bulunduğu satırın üstüne bir satır açar.
TAB = Kodu yazmaya başladığınızda kodun devamını tamamlar.
TAB + TAB = FOR yazıp TAB + TAB yaptığınızda FOR döngüsünün geri kalan kısımlarını otomatik yazar.








CTRL + SPACE = Kodu yazmaya başladığınızda yazdığınız harfler ile başlayan kodların listesini gösterir. İstediğiniz kod görünmüyorsa ilgili NamaSpace i projeye eklememişsinizdir. Liste açılmıyorsa bazen nedense takılıyor. Takıldığı zaman kod sayfasını kapatıp yeniden açın. Örn DataTable için "using System.Data;" gerekir.


CTRL + K + S = Yazdığınız kodları IF, TRY, FOR gibi kontrol ve döngü bloklarının arasına almak için, kodları seçip bu kısayolu kullandığınızda size bir liste açar ve siz o listeden istediğiniz komutu seçersiniz. Bu şekilde seçtiğiniz tüm kodları seçtiğiniz kontrol veya döngü ile çevreler. SURROUND







CTRL + K + D = Sayfadaki tüm kodları düzenler. Herhangi satırda hata var ise düzenleme yapmaz. Önce o hatayı gidermelisiniz.
CTRL + M + M = Çalıştığınız kod bloğunu kapatır. Aynı işlem tekrar açar.
CTRL + M + O = Sayfadaki tüm kod bloklarını kapatır.
CTRL + M + L = Sayfadaki tüm kod bloklarını namespace' e kadar kapatır.
CTRL + M + X = Sayfadaki tüm kod bloklarını açar.
CTRL + K + C = imlecin bulunduğu yada seçtiğiniz satrıları yorum satırı yapar.
CTRL + K + U = imlecin bulunduğu yada seçtiğiniz satrıları yorum satırından çıkarır.

CTRL + L = İmlecin bulunduğu satırı siler ve kopyalar.
SHIFT + DELETE = İmlecin bulunduğu satırı siler ve kopyalar.
CTRL + INSERT = Kopyalanan kodu yapıştırır. CTRL + V ile aynı işi yapar.
CTRL + SHIFT + ENTER = Programı tam ekran yapar. Aynı işlem tam ekrandan çıkarır. Çift monitör kullanıyorsanız enfes oluyor
CTRL + F = Kodlarda arama yapma penceresini açar. Pence sağ üstte açılır orada arama alanını genişletebilirsiniz.


CTRL + H = Bul ve değiştir penceresini açar



CTRL + G = İstenen satıra gider.
CTRL + SHIFT +UP/DOWN = Bir değişken veya tanım üzerinde tıklayın ve CTRL + SHIFT tuşlarına basılı tutun. Sayfadaki tüm ilgili değişkenin isimlerini seçecektir. Yön tuşları ile bu seçilenler arasında gezebilirsiniz.
SHIFT + ALT + YÖN TUŞLARI = SHIFT + ALT tuşlarını basılı tutarak mouse veya yön tuşları ile dikey seçim yapıp kopyalama yapabilirsiniz. Buna daha çok stun seçimi diyebiliriz. Aşağıdaki gif' te uygulamasını görebilirsiniz. (Yalnız bu efsane birşey :)  )
Bazılarının açıklamasını tam yapamadığım için bazı sitelerden yardım aldım. Hepsi bildiğim ve kullandığım kısayollarıdır ancak en sondakini başka bir siteden buldum ve gerçekten efsane bir birşey olduğu için buraya yazdım. Yani bende yeni öğrendim ve tepkim;
abartısız bu şekilde olduHer zaman derdim o kadar şey yaptınız bunu neden yapmadınız diye ama meğersem zaten varmış 
Bu dersimizde bu kadar arkadaşlar.
Bol Kodlu Günler...

0 Yorum:

C# Bir Kod Bloğunun Toplam İşlem Süresini Bulmak (Stopwatch)

Nisan 19, 2017 Mustafa BÜKÜLMEZ 0 Yorum

Selamlar bu dersimizde c# da bir kod bloğunun yada bir sql sorgusunun çalışma süresini nasıl buluruz ona bakacağız.


Selamlar arkadaşlar,
Bu dersimize C# da bir kod bloğunun yada bir sql sorgunun çalışma zamanını yani işlemi kaç zamanda (dakika, saniye milisaniye vs.) yaptığını bulmayı anlatmaya çalışacağım.
Bu işleme StopWatch denir ve bunun için çok kısa bir kodumuz var. Hemen görelim.
C#
using System.Diagnostics;
//
//
//

Stopwatch watch = new Stopwatch();
watch.Start();

// kodlarımızı buraya yazıyoruz.

watch.Stop();
// Bir DevExpress nesnesi olan listBoxControl' a süreyi yazıyoruz.
listBoxControl1.Items.Add(watch.Elapsed.Milliseconds);
Hesaplama Start(); ile başlar. Stop(); ile biter. Geçen süre Elapsed değişkeni olarak tutulur.
Kullanabileceğimiz zaman dilimleri,
C#
// MiliSaniye
listBoxControl1.Items.Add(watch.Elapsed.Milliseconds);

//Saniye
listBoxControl1.Items.Add(watch.Elapsed.Seconds);

//Tick
listBoxControl1.Items.Add(watch.Elapsed.Ticks);

//Dakika
listBoxControl1.Items.Add(watch.Elapsed.Minutes);

//Saat
listBoxControl1.Items.Add(watch.Elapsed.Hours);

//Gün
listBoxControl1.Items.Add(watch.Elapsed.Days);

Ekran Çıktıları:

Valla ben Tick'i saniye olarak biliyordum ama öyle değil sanırım Bu dersimizde bu kadar arkadaşlar.
Bol Kodlu Günler.

0 Yorum: