26 Ekim 2009 Pazartesi

StringBuilder

I. Versiyon

string s1 = "deneme";
for(i = 0; i < 10 ; i++)
{
         s1 += i.ToString();
}

II. Versiyon

StringBuilder s1 = new StringBuilder("deneme");
for(i = 0; i < 10 ; i++)
{
          s1.Append(i)
}

bu iki kod parçasına bakılırsa biri String'e String ekleyerek yeni String oluşturarak diğeri ise StringBuilder classını kullanarak bu class'ın Append metoduyla ekleyerek ayni sonucu veriyor. Fakat aralarında önemli bir fark var. String'ler değişmezdir yani bir kere yaratıldıklarında üzerlerinde değişiklik yaptığımızda bu değişiklik üstüne eklenmez bellekte yeni bir String oluşur. Yani örneğimize bakarsak önce s1 "deneme" olarak geldi. Ardından for bir kez döndü ve sonuc "deneme0" oldu bu oluken deneme nesnesi hala belektedir ve "deneme0" için bellekte yeni bir yer açılır. Bu durum bizim örneğimizde 10 kez dönüyorsa bellekte 10 String için yer demektir bizi şimdilik çok etkilemez ama daha büyük sayılı döngülerde işimizi zorlaştıracaktır.

Bu istenmeyen bellek yükünden kurtulmak için böyle durumlarda StringBuilder imdadımıza koşuyor. Nasıl koşuyor 1. örnekte bellekte 10 tane String oluşurken 2. örnekte sadece bir String oluşuyor. Çünkü değişken olmadığı için Append metodu ile string üzerinde istediğimiz gibi oynayabiliyoruz. Bu da bize büyük bir performans artısı sağlıyor.

Isimlendirme Kuralları

Isimlendirme kuralları diyince önemli 2 kural vardır:

PascalCasing
camelCasing

Bu kuralları açıklamadan önce isimlendirme yapılırken uyulması gerekenlere bakalım:

1- Isimlendirme yapılırken değişkene veya metoda ne ise ona verilen ismin başlangıcı harf veya alt tire olabilir.
2- Ilk harf alt tire ise yanına en az bir harf veya sayı getirilmelidir.
3- Her isim sadece harf,sayı veya alt tireden oluşur.
4- Isimlendirme yapılırken C# ın kullandığı anahtar kelimeler kullanılmaz mesela string adında bir değişken tanımlayamayız.

PascalCasing : Bu isimlendirme metodunda Pascalcasing veya Pascal_Casing yazmak yerine iki veya daha fazla kelimeli isimlendirmelerde her kelimenin baş harfını büyük ve kelimeleri bitişik yazma esas alan bir metoddur.

PascalCasing'i kodumuzda

- Class
- Metod
- Property
- Event
- Namespace

yazarken kullanmalıyız.


camelCasing : Bunun PascalCasing'den farkı bu metotda ilk kelime hariç tüm kelimelerin ilk harflerinin büyük ve bitişik yazılamasını esas alır.

camelCasing'i kodumuzda

- Değişken
- Parametre

yazarken kullanmalıyız.

Bu metodları kullanmak kodumuzu okunaklı hale getirdiği için uygulanması çok önemlidir. Ayrıca değişken olsun metod olsun bunları isimlendirirken işlevlerine uygun isim vermekte kodumuzu okunur kılacak olan önemli bir özelliktir. Bunlara dikkat edilmesi gerekmektedir.

Birden Çok Event'ı Tek Event Handler'a Bağlamak

Bu kısaca ne anlama geliyor ona bakarsak diyelim ki bir butonumuz var bu buton tıklama veya enter eventlarında ayni işi yapmasını istiyoruz bu durumda ikisi içinde ayrı event handler oluşturmak yerine ayni event handler içinde bu iki eventida kontrol edebiliriz. Bunun için bundan bir önceki konumuz olan Kod ile Kontrole EventHandler Ekleme yazısında öğrendiğimiz gibi oluşturduğumuz buttona [FormAdı].Designer.cs dosyasının içerisinde ki InitializeComponent() metodunun altına

this.button1.Click += new System.EventHandler(button1_Click);

yazarak 'button1_Click' altında yapmasını istediğimiz komutları yazarak tıklama eventını handle edebildik. Peki enter yapıldığında da enter eventını 'button1_Click' metoduyla handle etmek istesek ne yaparız? Bunun için ayni şekilde:

 this.button1.Enter += new System.EventHandler(button1_Click);

yaparak Enter eventinide  'button1_Click' metoduna bağlamış olduk. Artık hem tıklandığında hemde enter yapıldığında bu metodun içindeki kodlar çalıştırılacak.

14 Ekim 2009 Çarşamba

Kod ile Kontrole Event Handler Ekleme

Yine Visual Studio'nun eşsiz güzelliklerinden biri olan biliyorsunuz ki bir kontrole event eklemek için o kontrole iki kere tıklamak yeterli. Ama yine biz bunu kod ile yapmak istersek nasıl yapacapız?

Öncelikle [FormAdı].Designer.cs dosyasının içerisinde ki InitializeComponent() metodunun altına

                this.button1.Click += new System.EventHandler(this.button1_Click);

Eklememiz yeterlidir. Mesela burada buton kontrolüne tıklama eventini bağlıyoruz. Yine otomatik oluşturulan buton tıklanınca programın ne yapcağı ile ilgili metodu ise  [FormAdı].cs altına

                private void button1_Click(object sender, EventArgs e)
                {

                 }


şeklinde tanımlayıp programımızın butona tıklayınca neler yapmasını istiyorsak metodun blokları arasına o kodu yazmamız yeterlidir.

Anchor,Dock, Tabindex Kontrol Özellikleri

Anchor : Formu 'ekranı kapla' tıklandığında form üzerinde ki tüm textbox, label,listbox,panel vb.. varsa büyümesini daha doğrusu ekranı kaplayacak şekilde default halıyle hepsinin birbiri ile ölçeklenerek orantılı olarak sağ - sol - alt - üst nerelerden büyümesini istediğimiz ayar.

Dock : Form üzerindeki textbox, label vb.. alt - üst - sağ - sol - orta istebilen alanı kaplıcak şekilde forma yerleştirmeye ayarlayan özellik

Tabindex : Bu ekran üzerinde tab tuşuna basıldıkça hangi elemente gideceğinin sorasını belirtmek için kullanılır. Mesela bir butonun Tabindex'i 0 olsun sonra bir textbox ekleyelim bunun Tabindex'ini 1 yapalım sayfa açıldığında butona odaklanmış şekilde gelir taba basınca textbox'a geçer

Kod ile Kontrol Ekleme

Bir çoğumuz Visual Studio'nun çok büyük bir nimeti olan sürükle bıraka alışmışızdır. Fakat arka planda sürükle bırak yapınca hangi kodlar oluşturuluyor veya sürükle bırak yapmadan forma kontrol eklemek isteseniz ne yaparız?

Örnek olarak sürükle birak yapmadan forma bir buton eklemek istedik. Bu durumda [FormAdı].Designer.cs dosyamızın içine System.Windows.Forms.Button() altında bir buton nesnesi tanımlamalıyız.

           private System.Windows.Forms.Button button1; 

Ardından InitializeComponent() metodunun altına

           this.button1 = new System.Windows.Forms.Button();
           this.Controls.Add(this.button1);

dersek boş bir buton formun sol üst köşesinde yaratılmış olur. Bu butona özellikler vermek istersek. Yine InitializeComponent() altında


            this.button1.Location = new System.Drawing.Point(98, 71);
            this.button1.Name = "button1";
            this.button1.Size = new System.Drawing.Size(75, 23);
            this.button1.TabIndex = 0;
            this.button1.Text = "button1";
            this.button1.UseVisualStyleBackColor = true;


gibi propertieslerde Properties Window yerine kod içinde değiştirilebilir.

9 Eylül 2009 Çarşamba

ASP.Net MVC Framework Semineri

.NET Platformunun en önemli proje geliştirme araçlarından biri olan ASP.NET için yeni bir geliştirme modeli olarak MVC Framework Microsoft tarafından yayınlanmasının ardından büyük bir ASP.NET geliştiricisi kitlesi tarafından yoğun ilgi görmekte. Test yönelimli mimariye tam uyumlu olan, geliştirici sayısının fazla olduğu projelerde geliştirme işlemlerini kolaylaştıran,tasarımı ve geliştirme arayüzleri ile  geliştirici için alışılmış ASP.NET Web Forms’lara göre oldukça sade ve kolay bir geliştirme ortamı sunan ASP.NET MVC Framework bir yazılımcı gözü ile incelenecektir.


Seminer AdıASP.NET MVC Framework
KonuşmacıOğuz Yağmur (MVP)
Tarih30 Eylül 2009 Çarşamba
Saat15:00 – 18 :00
Kontenjan60

  • MVC Nedir?
  • Asp.Net MVC Framework’un Özellikleri
  • Asp.Net  MVC Framework hangi durumlarda tercih edilebilir?
  • Asp.Net MVC Pipeline ve çalışma modeli
  • Model Kavrami
  • View Kavrami
  • Controller Kavrami
  • Özelleştirmeler
  • Asp.Net MVC ve Ajax
  • Asp.net MVC ile TDD (Test Driven Development)
  • ASP.NET MVC Framework Demoları

4 Eylül 2009 Cuma

İlk Yazı..

Merhabalar arkadaşlar. Uzun zamandır bişi yazmadım farkındayım hatta .Net teklolojileriyle ilgili bu bloğuma hiç birşey yazmadım bununda farkındayım neden diye sorarsanız çok yoruluyorum ya yazıcak halim kalmıyor beni de anlayın azcık. Neyse neyse artık yazıcam umarım takip edenlere yararlı bilgiler verebilirim.

Şimdi nerden çıktı bu Microsoftçuluğa geleyim. Bildiğini gibi yada bilmiyorsunuz o zaman hemen açıklayayım bundan bir bucuk ay önce falan Java ve .Net arasında kalmıştım ikisinden birinde kendimi geliştirip uzmanlaşmak istiyordum ama karar veremiyordum. Bu sırada karar vermeme yardımcı olan bir şey oldu 22 Temmuz 2009 itibariyle İTÜ Arı Teknokent'te bulunan Ericsson'un bir alt şirketi olan "Bizitek Bilgisayar Yazılım ve İnternet Teknolojileri" şirketinde "IT" bölümünde Sistem'le ilgili yaptığım stajımın ardından şimdi "Proje" de yazılımcı olarak part-time çalışıyorum ve burada .Net teknolojileri kullanılıyor bu kararımı vermeme yardımcı oldu ve kararımı verdim. Kararım: .Net . Daha sonra Java'yla da ilgilenicem tabi ama şimdilik .Net kullanıyoruz arkadaşlar. Ama şunu da belirteyim süper biliyorum en iyisi benim falan diyip yazmıyorum bunları sadece öğrendiklerimi sizle paylaşmak istiyorum. "How to.." bıdı bıdı aramalarda gördüğümüz gibi Türkçe yardım bulmak çok zor belki benim başıma gelen olayları paylaşırsam üç beş yirmi kişiye yardımı dokunur amacım bu kimse gelip artistlik yapmasın ha.

Neyse task'ım geldi ben giderim hadi iyi okumalar size beni izlemeye devam edin şeklinde bir reklamla yazımı bitiriyorum.

7 Temmuz 2009 Salı

Java Programımızı Derleme ve Çalıştırma

Derleme
Öncelikle yazdığımız programı derleyebilmemiz için bilgisayarımızda Java SE Development Kit’i (JDK)
http://java.sun.com/javase/downloads/index.jsp
adresinden yüklememiz gerekmektedir. Bunu yüklediyseniz kodunuzda hazırsa şimdi Command Prompt ekranını açabiliriz. Bunu yapabilmek için Run’a cmd yazıp Enter’a basın.

java, java ders, java konular, java öğren, java geliştir,java tutorial

Açılan ekranda kodumuzun olduğu dizine gitmek için ‘cd’ komutunu kullanabiliriz. Ardından

javac sourcecode_filename

örneğin;

javac SimpleProgram.java

Ayni anda birden fazla programı derlemek istiyorsak

javac Foo.java Bar.java Another.java

gibi aralarına boşluk bırakarak yan yana yazılarak ayni anda compile edilebilir.

javac *.java

ile o dizindeki tüm kodlar compile edilir.

Önemli! “javac' is not recognized as an internal or external command” bu hatayla karşılaşabilirsiz. Bunu şöyle çözebilirsiniz:

C:\foo\bar\> C:\j2sdk1.4.2_01\bin\javac Filename.java


Çalıştırma

java SimpleProgram

ile derlediğiz kodu caliştirabiliriz.

Eğer farklı dizinlerdeki programları caliştirmak gerekiyorsa

java –cp dizin1;dizin2 SimpleProgram

kullanılır.
Önemli! Main Class’ın ismiyle dosyanın ismi ayni olmalıdır. Mesela Main Class’ımız SimpleProgram ise notpad’te ‘Farklı Kaydet’ yaparken SimpleProgram.java diye kaydetmeliyiz.

Bunu Unutma! \' Print içinde tek tırnağı ekrana yazdırabilmek için kullanılır
\" Print içinde çift tırnağı ekrana yazdırabilmek için kullanılır

Java Platform Bağımsızdır

Bu gerçekten Java’nın çok önemli bir özelliği çünkü C,C# gibi diller derlendiğinde her makinada çalışabilmesi için 0 ve 1 lerden oluşan makine diline çevrilirler ve bu işlem işletim sistemi üzerinde olur. Burada bir sorun yok her makinada çalışmayı sağlıyor çok güzel gibi görünsede ayni kod Windows’ta derlenmişse farklı, Solaris’te derslenmişse farklı yada Linux’te derlenmişse oluyor. Buda yazdığımız kodun başka bir platformda çalışmaması anlamina geliyor. Yani Windows’ta yazmışsan sadece Windows’ta kullanabiliyorsun.

java, java öğren, java geliştir, java yaz, java ders, java tutorial


Java’nın Platform Bağımsız olması şu anlama geliyor. Bir kere yaz her yerde çalışsın mantığı var. Çünkü C,C# gibi diller makinenin işletim sisteminde derlendiği için platform bağımlıdır. Fakat Java JVM(Java Virtual Machine) üzerinden çalışır. Bu yüzden ayni program nerde derlenirse derlensin ayni bytecode’u üretir bu yüzden bir kere yazıldıktan sonra istenilen ortamlarda çalıştırmak mümkündür. Burdaki tek sorun hız sorunudur. Çünkü işletim sistemiyle birlikte Virtual Machine’de bilgisayarın bilgisayarın kaynaklarını kullandığı için daha yavaş calişmaktadır.

java, java öğren, java geliştir, java yaz, java ders, java tutorial

Not : Resimler Jacquie Barker’ın ‘Beginning Java Objects’ adlı kitabından alınmıştır.


Proje Özeti

java,java ders,java öğren,java geliştir,java tutorial,OOP Bir projenin sistemin modellemesini yaparken önce derinlere inmeden projenin amacını, son kullanıcının neler yapabileceğini ve teknik gereksinimleri içeren bir özet çıkarırsak modelleme yaparken sistemi daha basitleştirmiş oluruz. Örneğin USİS gibi öğrenci ders kayıt sistemi modellediğimizi düşünelim.


AMAÇ : Öğrencilerin derslerini alıp, ders programlarının görebileceği bir sistem tasarlamak

İŞLEVSEL GEREKSİNİMLER : Öğrenci ders seçebilecek, sonra bu dersi silebilecek, ders programını görebilecek

TEKNİK GEREKSİNİMLER : SQL Server, Windows NT ve üstü

Bu şekilde derinlemesine özet çıkarmasamda böyle bir özet çıkarırsak model kafamızda daha iyi oturur ve bu sayede sistemi daha kolay modelleyebiliriz. İşinize yarayacaktır deneyin.

6 Temmuz 2009 Pazartesi

Sınıflandırma

Mesela gerçek hayattan bir örnekle yaşayan canlıları düşünelim: bitkiler ve hayvanlar. Gördüğünüz gibi yaşayan canlıları ikiye böldük eğer bizim işimiz hayvanlar ise artık elimizde sadece hayvanlar var. Daha sonra daha derine inersek hayvanlar içinde: balıklar, memeliler, böcekler diye daha da bölebiliriz. Mesela burada da işimiz memelilerle ise elimizde sadece memeliler kalıyor. Yani bir önce ki yazımda bahsettiğim soyutlamayı sınıflandırma hiyerarşisi ile yapmış oluyoruz. İstediğimiz topluluğa ulaşmak için bütün topluluğu sınıflara ayırıyoruz ve istediğimiz kesime ulaşıyoruz.

Bu yapı OOP’ de çok önemli bir kavram olan kalıtımın mantığı diyebiliriz. O yüzden bunun mantığını öğrenmek çok önemli.
siniflandirma, java, object oriented,nesneye yönelik,java öğren, java geliştir, java tutorial,java ders

Soyutlama ve Modelleme

java,OOP, object oriented,nesneye yönelik,java öğren, java yaz, java tutorialBloğumu okuduğunuz bilgisayarınızdan başınızı kaldırıp birkaç dakika odanıza veya her nerdeyseniz bulunduğunuz ortama şöyle bir bakmanızı istiyorum. Muhtemelen bir lamba, bir masa, bir koltuk gibi şeyler göreceksiniz. Bunlar sizin için yeni değil hatta her gün odanıza girdiğinizde gördüğünüz olağan ezberlediğiniz şeyler. Ama şimdi herhangi bir tanesine çok daha dikkatli bakmanızı istiyorum mesela masanızda duran o kalemliğe bakın. Rengine, şekline, neyden yapılmış olabileceğine. Böyle daha dikkatli baktıkça daha önce farkına varmadığınız birçok özelliğinin olduğunu göreceksiniz. Çünkü insan beyni algıladıklarının önemsiz kısımlarını soyutlar sadece önemli olan kısmını algılar. Bunun böyle olması gayet normal çünkü insan duyuları gün içinde milyonlarca kez uyarılır. Ama beynimiz önemsiz görülen kısmını soyutladığı için bu milyonlarca uyarı bizim için bir sorun olmaz. Kalemlik örneğindeki olayda bundan ibaret mesela şu an odanıza baktığınızda oda da bulunan her nesnenin tüm özelliklerini algıladığınızı düşünürseniz bu sizin için çok büyük bir yük olacaktır ama beynimiz bunları soyutlar ve biz sadece bize gerekli olan algılarız.

Yine Jacquie Barker kitabında soyutlama ile ilgili şöyle bir örnek veriyor. Biyoloji kitaplarındaki hücre şekillerini düşünün. Aslinda içinde milyonlarca yapı olmasına rağmen sadece mitokondri, çekirdek hücre zarı gibi önemli kısımlarını gösterirler. Çünkü küçük küçük milyonlarcasını açıklamaya gerek yoktur; çekirdek, mitokondri gibi önemli yapılar hücre nesnesini genellerler.

Bunların OO ile ne alakası var peki? Bir OO modellemesi yaparken elimizdeki her şey bir nesnedir. Yani sistemi kurarken ele alacağımız her nesneyi ilk örneğimizde nasıl kalemliğimize baktığımızda daha birçok özelliğini keşfetmişsek kuracağımız sistemde kullanacağımız nesnelerinde karakteristik özelliklerini bu şekilde bulmalıyız. Fakat bir nesnenin yüzlerce özelliği çıkabilir. Bu durumda da ikinci örnekte olduğu gibi hücrenin milyonlarca yapısı olduğu halde kitaplarda bizim işimize yarayacakları alıp hücre genellemesi yapıyorlarsa bizde kuracağımız sistemdeki nesnelerin özelliklerini bulduktan sonra işimize yarayacak özelliklerini özenle seçip genelleme yapmalıyız. Çünkü gereksiz seçilen özellikler sistemi karmaşık içinden çıkılamaz hala getirirken ayni şekilde gerekli olduğu halde seçilmeyen özellikler ise sistemde sorunlara neden olur. Mesela bir sistem kurulurken yazılım yapacak kullanıcıların göz renklerinin sisteme alınması sadece sistemi karmaşık bir hale getirecektir çünkü böyle bir bilgiye ihtiyaç duyulmayacaktır. Yani kısaca nesnelerin özelliklerinin isteklerimizi karşılayacak bir şekilde bulunup, gereksizlerin soyutlanması OO bir sistem modellerken bizim en önemli uğraşımız olacaktır.

Doğru bir şekilde modellenen sistem aynı zamanda esnek bir yapıya sahip olmalıdır. Çünkü herhangi bir şey yanlış ise veya bir şey değiştirilmek istenirse eğer sistem esnek bir şekilde tasarlanmışsa ufak birkaç ekleme ile istenilen gerçekleşebilir. Fakat esnek bir yapısı yoksa sistemin yeniden modellemesi gerekir, kodların yeniden yazılması gerekir yani zaman ve para kaybıdır. Bu yüzden esnek yapı doğru modellenen sitemin en önemli özelliklerindendir.

Ama her ne kadar modelleme yaparken soyutlama beynimizin gereksiz uyarıları algılamamasına benzese de durumun bu kadar kolay olmayacağı kesin gibi. İlerleyen yazılarımda bunun ne kadar kolay ne kadar zor olduğunu birlikte göreceğiz.

İyi Bir Programcı Olmak için Nesne Neden Bu Kadar Önemli?

object oriented,nesneye yönelik programlama,OOP,java Öncelikle şunu kabul etmek lazım bir programlama dilinin tüm syntax’ını bilmek kimseyi çok iyi programcı yapmaz. Sen istediğin kadar java bil, c# bil hatta o dili tüm özelliklerine kadar bil LINQ’sü olsun, Servlet’i olsun ama bir problemle karşılaştığında onun modellemesini yapamıyorsan o bildiğin anlamsız söz dizimlerini bilmek hiçbir işimize yaramaz. Onlara ihtiyaca uygun anlam kazandıramıyorsan yazdıklarının hiçbir değeri yoktur. Tabi syntax’ını bilmiyorsan program yazman mümkün değil orası tartışılmaz ama benim anlatmak istediğim her iki satır kod yazabilen gerçek programcı değildir.


Bu konu hakkında Apress yayıncılıktan çıkan Jacquie Barker’ın ‘Beginning Java Objects’ adlı kitabından edindiğim bilgilere dayanarak yazıyorum. Zaten OOP hakkındaki çoğu yazımda bu kitaptan edindiğim bilgilere yer vereceğim. Ve kitap hakkında şunu söyleyebilirim gayet güzel bir kaynak ve tavsiye ederim.

Düşününce yazılım projelerini bir evin yapılışına benzetebiliriz. Öncelikle elimizdeki malzemeyi iyi tanıyıp onunla neler yapabileceğini bilmeliyiz. Yani kullanacağımız dile hakim olup, onunla neyi iyi yapıp neyi yapamayacağımızı bilmeliyiz. Ve bunu bilerek yazdığımız program esnek olmalı nasıl mı şöyle ki : evin penceresini beğenmediğimizde tüm evi yıkmak yerine nasıl çıkarıp yenisini takabiliyorsak, yazdığımız programın bir yerinin değişmesi gerekiyorsa sadece o kısmı değiştirmenin mümkün olması gerekir. Tüm bunlar gerekli çünkü böyle olmuyorsa kullandığınız dilin birçok güzel özelliği vardır ve onları kullanmıyorsunuzdur. Müşteri sizden yazdığınız programın bir bölümünü değiştirmenizi istediğinde programı baştan yazmaya kalkarsanız para ve zaman kaybınız çok olacaktır. Bunun gibi birçok nedenden ötürü bu OO yapıyı oluşturmak çok önemlidir. Yani kod yazmanın ötesinde bu OO yapıyı oluşturabilmek gerçek programcı olmanızı sağlayacaktır.

Tavsiyem bu yüzden java veya c# gibi nesneye yönelik programlama dili öğrenirken en azından elinize ‘Object Oriented’ la ilgili bir kitapta alın faydasını göreceksiniz.

3 Temmuz 2009 Cuma

Hello Java!

java,java öğren,java tutorial,online java,java kod,java codeBu bloğu açmamda ki amacım bildiklerimi, öğrendiklerimi java teknolojilerini merak edenlerle paylaşmak umarım bunu gerçekleştirebilirim. Bu bloğu açma nedenimi kişisel sayfamda yazdığım şu yazıdan daha detaylı öğrenebilirsiniz : http://safakunel.blogspot.com/2009/07/javagelistir-netgelistir.html

Her ne kadar Java desem de öncelikle ‘Object Oriented’ üzerine yazılar yazacağım. Bunun nedenini ileriki yazılarımda açıklayacağım için şimdi bir açıklamaya gerek yok sanırım.

‘Java’ ve ‘Object Oriented’ üzerine aldığım ders ve kurslar :

- YTÜ Matematik Mühendisliği Nesneye Yönelik Programlama Nilgün Güler, Yrd. Doç. Dr.

- YTÜ Matematik ‘Java ile Programlamaya Giriş’

- EDUTIME ‘Java Eğitimi’ (50 saat)

Bende çok iyi bildiğimi iddaa etmiyorum ve bu blogla uzmanlaşmayı hedefliyorum. Takip edecek herkese şimdiden çok teşekkürler ve kolay gelsin!

Hoşçakalın!
Share/Save/Bookmark