22 Şubat 2015 Pazar

İlk Android Uygulamamızı Yapıp Telefonda Çalıştıralım


Bu yazımda android'te basit bir hesap makinesini nasıl yapacağımızı ve yaptığımız bu uygulamayı telefonumuza yükleyip nasıl çalıştıracağımızı anlatacağım. Daha önce hiç denemediyseniz öncelikle geliştirme ortamını bilgisayarınıza kurmalısınız. Bunun için hemen bu adrese girerek Android SDK'i indirin ve Eclipse'sinize entegre edin. Bunun nasıl yapıldığını yazmayacağım (çünkü unuttum ve şimdi hatırlamak için zaman harcamak istemiyorum) ama bu videoyu izleyerek kolayca yapabilirsiniz. Yada bu adresten Android Studio'yu kurarak herhangi bir entegrasyon yapmadan doğrudan uygulama geliştirmeye başlayabilirsiniz. Ama baştan söyleyeyim bu örnek için ben emektar Eclipse'imi kullanacağım. Daha sonraki yazılarımda Android Studio'ya geçersem orada da devam edebilirim.

Başlamadan önce söylemeliyim ki aşağıda yazdığım kodları direk verdim ve yeri geldiğinde bir kaç kısa açıklamada yaptım. Kodlar sizi korkutmasın. Bu bir ders değil o yüzden kodlar üzerinde fazla durmayın. Eğer java'ya aşina değilseniz kodları anlamakta güçlük çekebilirsiniz bu yüzden kodlara çok takılmayın. Burada adım adım bir proje nasıl oluşturulur, test edilir ve telefona yüklenir bunları göreceksiniz. Android programlamayı öğrenmek istiyorsanız java ile başlamanızı tavsiye ederim.

Öyleyse hemem Eclipse'i açıp File>New>Android Application Project diyerek yeni bir proje oluşturalım.


İlk pencerede uygulamanıza bir isim verin. Sonra next diyerek ilerleyin ve son pencerede Finish butonuna tıklayarak projenizi açın.




Sol paneldeki Package Explorer'dan projenizi bulup içersinden
res>layout>activity_main.xml dizininden activity_main_xml dosyasını açın. 


Bu dosya uygulamamızın görsel düzenini tasarlamamızı sağlar. Eclipse penceresi altında Graphical Layout sekmesine geçerseniz bu işi kod yazmadan da yapabilirsiniz. Tek yapmanız gereken soldan kullanmak istediğiniz bileşeni uygulamanızın üstüne taşımak. Çoğu profesyonal programcı activity_main.xml kullanmayı tercih eder ki bizde ilerki derslerde bunu yapacağız. Çünkü xml kodları ile çok daha esnek bir tasarım yapabiliriz. 


Şimdi aşağıdaki basit arayüzü oluşturacağız. Bunun için soldaki paletten 3 tane TextView (Number1, Number2, Result), 3 tane EditText ve 4 tanede Buton (+,-,*,/) ekleyin.


Eklediğiniz bu bileşenleri sağ taraftaki structure menüsünden görebilir ve onları seçerek bir takım özelliklerini aşağıda ayarlayabilirsiniz. Şimdilik sadece TextView'lerin ve Buton'ların text özelliklerini değiştirerek resimdeki haline getirelim.


Eğer kendiniz Graphical Layout ile yapamadıysanız activity_main.xml dosyasını açıp aşağıdaki kodu içerisine kopyalayın. Aynı görünüşü elde edeceksiniz.

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:layout_marginLeft="25dp"
        android:layout_marginTop="20dp"
        android:text="Number1 :" />

    <TextView
        android:id="@+id/textView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/textView1"
        android:layout_below="@+id/textView1"
        android:layout_marginTop="16dp"
        android:text="Number2 :" />

    <EditText
        android:id="@+id/editText1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@+id/textView1"
        android:layout_alignBottom="@+id/textView1"
        android:layout_marginLeft="17dp"
        android:layout_toRightOf="@+id/textView1"
        android:ems="10"
        android:inputType="textPersonName" >

        <requestFocus />
    </EditText>

    <EditText
        android:id="@+id/editText2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/editText1"
        android:layout_alignTop="@+id/textView2"
        android:ems="10" />

    <Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@+id/button1"
        android:layout_alignBottom="@+id/button1"
        android:layout_toRightOf="@+id/button1"
        android:text="-" />

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignRight="@+id/textView2"
        android:layout_below="@+id/editText2"
        android:layout_marginTop="27dp"
        android:text="+" />

    <Button
        android:id="@+id/button3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/button2"
        android:layout_below="@+id/button2"
        android:layout_marginTop="17dp"
        android:text="*" />

    <Button
        android:id="@+id/button4"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@+id/button3"
        android:layout_alignBottom="@+id/button3"
        android:layout_toRightOf="@+id/button3"
        android:text="/" />

    <TextView
        android:id="@+id/textView3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/button1"
        android:layout_below="@+id/button3"
        android:layout_marginTop="24dp"
        android:text="Result : " />

    <EditText
        android:id="@+id/editText3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@+id/textView3"
        android:layout_alignBottom="@+id/textView3"
        android:layout_toRightOf="@+id/textView3"
        android:ems="10" />

</RelativeLayout>

Evet şimdi kod kısmına geçiyorum. Bunun için yine sol panele gidip projeniz içerisinde src>paket isminiz>MainActivity.java dosyasını açalım. Bu uygulamamızın çalıştıracağı java programı olacak. Eğer java'ya aşina değilseniz hazırladığım java derslerini takip edebilirsiniz. 





Kodumuz aşağıdaki gibi. Doğrudan alıp MainActivity.java'nın içerisine yapıştırın.

package com.example.calculator;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;

public class MainActivity extends Activity {

 
Button b1,b2,b3,b4;
EditText tf1,tf2,tf3;
 
 
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

b1 = (Button) findViewById(R.id.button1);
b2 = (Button) findViewById(R.id.button2);
b3 = (Button) findViewById(R.id.button3);
b4 = (Button) findViewById(R.id.button4);
  
tf1 = (EditText) findViewById(R.id.editText1);
tf2 = (EditText) findViewById(R.id.editText2);
tf3 = (EditText) findViewById(R.id.editText3);
  
b1.setOnClickListener(new OnClickListener(){

@Override
public void onClick(View arg0) {
float sayi1 = Integer.parseInt(tf1.getText().toString());
float sayi2 = Integer.parseInt(tf2.getText().toString());

float sonuc = sayi1 + sayi2;

tf3.setText(Float.toString(sonuc));
}
  
});
  
b2.setOnClickListener(new OnClickListener(){

@Override
public void onClick(View arg0) {
float sayi1 = Integer.parseInt(tf1.getText().toString());
float sayi2 = Integer.parseInt(tf2.getText().toString());

float sonuc = sayi1 - sayi2;

tf3.setText(Float.toString(sonuc));
}
 
 
});


b3.setOnClickListener(new OnClickListener(){

@Override
public void onClick(View arg0) {
float sayi1 = Integer.parseInt(tf1.getText().toString());
float sayi2 = Integer.parseInt(tf2.getText().toString());

float sonuc = sayi1 * sayi2;

tf3.setText(Float.toString(sonuc));
}

 
});
 
 
b4.setOnClickListener(new OnClickListener(){

@Override
public void onClick(View arg0) {
float sayi1 = Integer.parseInt(tf1.getText().toString());
float sayi2 = Integer.parseInt(tf2.getText().toString());

float sonuc = sayi1 / sayi2;

tf3.setText(Float.toString(sonuc));
}
 
 
});    
 
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}

}

Şimdi kodumuzu biraz açıklayalım. Öncelikle MainActivity sınıfının içerisinde b1,b2,b3,b4 adında 4 tane buton ve tf1,tf2,tf3 adında 3 tane metin alanı tanımladık. Bunları onCreate metodu içerisinde daha önce activity_main.xml dosyası içerisinde tanımlamış olduğumuz nesnelere atamış olduk. Ondan sonra tek yaptığımız iş OnClickListener sınıfını butonların setOnClickListener metodları içerisinde gerçekleyerek (implementation) her biri için ilgili butona basıldığında ne yapılması gerektiğini yazdık. Buda işlem yapılacak sayıları birinci ve ikinci EditText'lerden getText() metodu ile alarak birinci buton için toplama ikincisi için çıkarma üçüncüsü için çarpma ve dördüncüsü için ise bölme işlemi yapmak. İşlemin sonucunu ise üçüncü EditText'te setText() metodunu kullanarak yazdırdık. Hepsi bu kadar.

Şimdi bir sanal makine oluşturarak programımızı önce bilgisayarda test edelim. Bunun için menüden Android Virtual Device Manager'a tıklayın. 


Açılan pencereden sağ taraftaki New seçeneğini seçerek yeni bir sanal makine oluşturalım.


Sanal makinenize bir isim verin ve aşağıdaki ayarlamaları yaparak OK butonuna tıklayarak bitirin.


Şimdi Run>Run Configurations... seçeneklerine tıklayarak aşağıdaki pencereyi açın. Açılan pencereden Target kısmına geçin soldan projenizi sağdan da oluşturduğunuz SanalMakine'yi seçin ve Run'a tıklayın.





Bilgisayarınız sanal makineyi yüklerken aşağıdaki ekran bilgisayarınızın hızına göre uzun bir süre ekranda kalabilir. Çalışmıyor deyip kapatmayın sabırla bekleyin, açılacaktır.


Uygulamanız çalıştıktan sonra aşağıdaki gibi görünecek.


Bu sanal emülatör modunda farenizi kullanabilirsiniz. Denemek için EditText'lere sayı değerleri girin ve istediğiniz işlem butonuna basın. Sonucun alttaki EditText'te çıktığını göreceksiniz.

Şimdi hazırladığımız bu uygulamayı telefonumuza yükleyelim. Bunu için sol panelden bin>res>Calculator.apk (kendi projeniz için bu isim farklı olabilir) dosyasını bulun  ve telefonunuza atın.



Bu uygulamayı yükleyebilmek için telefonunuzun güvenlik ayarlarından kaynağı belli olmayan uygulamaların yüklenmesi seçeneğini aktifleştirin. Bundan sonra uygulamanızı telefonunuza yükleyin ve çalıştırın.


İşte ilk android uygulamamızı yazıp, test edip, telefonumuzda çalıştırmış olduk. Umarım sizler için faydalı olmuştur. Sonraki yazımda görüşmek üzere.

Esen kalın.

@Emin_Ucer



Hadi Java Öğrenelim - Constructors (Yapıcı Metodlar)

Constructors yani "yapıcılar" javada nesneleri ilklendirmek(initialize) için kullanılan özel metotlardır. Nesne oluşturulma aşamasında çağrılırlar ve nesne için gerekli olan ilk ayarlama gibi işlemlerin yapılmasına imkan verirler.

Javada constructor oluşturmanın 2 kuralı vardır.

- Constructor ismi sınıf ismi ile aynı olmalıdır.
- Constructorlar açık şekilde tanımlı bir değer tipi döndürmezler.

Daha önceki destede belirttiğim gibi 2 türde olabilirler.

- Parametre almayan default-constructor
- Parametre alan constructor

Eğer bir formül isterseniz;

Default Constructor     : <sınıf_adı>(){}
Parametreli Constructor : <sınıf_adı>(parametreler){}

Eğer siz herhangi bir constructor tanımlamazsanız derleyici sizin yerinize boş bir default constructor tanımlayacaktır.

Aşağıdaki örnekte Araba1 sınıfının Araba1() adında bir default constructor'ı var. Yaptığı şey ise sadece ekrana "Araba Olusturuldu" yazmak. Nitekim daha önceki derste yaptığımız gibi bir main() metodu içerisine bu sınıfın bir nesnesini sadece aşağıdaki gibi tanımlayıp programı çalıştırırsak, nesnenin oluşturulma aşamasında constructor çağrılacağından ekrana "Araba Olusturuldu" yazılacaktır.

class Araba1{
Araba1() { System.out.println("Araba Olusturuldu"); }
public static void main(String args[]){
Araba1 a = new Araba1();
}
}

Program Çıktısı:

Araba Olusturuldu


Bir önceki yazımda parametre alan constructor'ı göstermiştim. Yukarıda da zaten formülize ettim. Aşağıdaki örneği inceleyip anlamaya çalışalım.


class Ogrenci{
String isim;
int numara;

Ogrenci(String ogrenciAdi, int ogrenciNumarasi){
isim = ogrenciAdi;
numara = ogrenciNumarasi;
}

void goster(){  System.out.println(numara + " " + isim); }

public static void main(String args[]){
Ogrenci s = new Ogrenci("Sherlock",221);
Ogrenci w = new Ogrenci("Watson",122);
s.goster();
w.goster();
}
}

Program Çıktısı:

221 Sherlock
122 Watson


Ogrenci sınıfının constructor'ı aldığı iki parametreyi (ogrenciAdi, ogrenciNumarasi) sınıfın isim ve numara değişkenlerine atayacaktır. goster() metodu sadece ekrana numara ve isim değerlerini aralarında bir boşluk bırakarak yazdırır. main() metoduna bakarsak nesneleri oluşturma aşamasında constructor'a parametre değerlerini ("Sherlock",221 ve "Watson",122)  verdik. Sonraki satırda ise bu sınıfın goster() metodu ile ekrana bu değerleri yazdırmış olduk. Program çıktısı verildiği gibi olacaktır.

[ Üzerinde durmaya gerek yok ama yeri geçti belirteyim. Sınıfın bir üyesine (değişken veya metod) ulaşmak için nesne isminden sonra "." koyuyoruz, s.goster() gibi. ]

Yine bir önceki ders belirttiğim gibi bir sınıfın birden fazla constructor'ı olabilir. Nasıl olur ? Eğer farklı parametrelere sahipse olur. Siz nesne oluşturma aşamasında ne tür parametre kullanıyorsanız ilgili constuctor otomatik olarak çağrılacaktır.


class Ogrenci{
int numara = 0;
String isim = "???";

Ogrenci(){}
Ogrenci(int ogrenciNumarasi){ numara = ogrenciNumarasi; }
Ogrenci(String ogrenciAdi){ isim = ogrenciAdi; }
Ogrenci(String ogrenciAdi, int ogrenciNumarasi){
isim = ogrenciAdi;
numara = ogrenciNumarasi;
}

void goster(){  System.out.println(numara + " " + isim); }

public static void main(String args[]){
Ogrenci a = new Ogrenci();
Ogrenci b = new Ogrenci(333);
Ogrenci c = new Ogrenci("Jill");
Ogrenci d = new Ogrenci("Superman",444);

a.goster();
b.goster();
c.goster();
d.goster();

}
}

Program Çıktısı:

0 ???
333 ???
0 Jill
444 Superman



Görüldüğü gibi bu örnekte tam 4 tane  cosntructor var. İlki boş bir dafault constuctor, herhangi bir işlem yapmıyor. Dolayısıyla bu constructor ile oluşturulan a nesnesinin çıktısı başlangıçta tanımlanmış numara = 0 ve isim = "???" değerlerini veriyor. İkincisi sadece ogrenciNumarasi diye bir parametreli bir constructor. Yaptığı iş aldığı değeri numara değişkenine atamak, isim değişkenine herhangi bir değişiklik yapmıyor. Dolayısıyla bu constructor ile oluşturulan b nesnesinin çıktısı "333 ???" şeklinde. Üçüncü cosntuctor da ikinciye benzer, bu sefer sadece isim değişkenini aldığı parametre ile değiştiriyor, haliyle çıktısı "0 Jill". Son constuctor iki parametre alarak iki değişkeninde değiştiriyor, bunun çıktısı ise görüldüğü gibi "444 Superman".

Örnekten de anlaşıldığı üzere aldığı parametreleri değiştirerek istediğimiz kadar constructor yazabilirsiniz.

Bir sonraki yazıda görüşmek üzere
İyi çalışmlar

@Emin_Ucer

10 Şubat 2015 Salı

Bir bilgisayarda 2 lokal sunucu çalıştırmak

Web uygulamalarımızı deneyebilmek için bilgisayarımıza geliştirdiğimiz platformu destekleyen sunucular kuruyoruz. Asp için Windows ile birlikte gelen IIS veya Php için XAMPP gibi. Ama bazen uygulama geliştirirken yerine göre Asp veya Php de kod yazıp denemeniz gerekiyor (en azından bana lazım oldu şimdi). Bu durumda bilgisayarınızda iki farklı servis sağlayıcının da kurulu olması gerekir. Peki hazırladığımız asp veya php sayfalarını diğer sunucuyu kaldırmadan nasıl çalıştıracağız ?

Biraz araştırdıktan sonra gördüm ki sunucuların kullandıkları portları değiştirmek yeterli oluyor bunun için. Genelde varsayılan olarak 80 portunu kullanıyorlar. Bunu değiştirmek için aşağıdaki adımları takip edin.

IIS için

Denetim Masası > Yönetimsel Araçlar > IIS (Internet Information Services)


Soldan "Default Web Site" seçtikten sonra sağdan da "Siteyi Düzenle" altındaki "Bağlamalar..." 'a tıklayın. 


Burada listede görünen bağlamaya tıklayıp düzenle deyin.


Gelen pencerede "Bağlantı Noktası" sunucunuzun kullandığı port oluyor. Bunu başka bir port numarasıyla değiştirebilirsiniz. Değişiklikten sonra "Tamam" demeyi unutmayın.

Bu değişiklikten sonra lokal sunucunuza ulaşmak için tarayıcıcınızın adres satırına artık atadığınız port numarasınıda ":" ifadesinden sonra girmelisiniz. Bu örnek için "localhost:83". Diğer sunucuya da eğer default ise direk "localhost" diyerek bağlanabilirsiniz.



XAMPP için

Eğer ilk olarak IIS kurduysanız, XAMPP'i kurduğunuzda Apache sunucusu aynı portu kullanmaya çalışacağından çakışıp başlamayacaktır. Bunu önlemenin yolu Apache sunucusunun kullandığı portu değiştirmektir. Bunun için XAMPP kontrol panelinden Apache için Config butonuna tıklayarak açılan menüden "Apache (httpd.conf)" seçeneğine tıklayın.


Açılan not defterinden "Listen 80" ifadesini bulup istediğiniz port değeriyle değiştirin (bu örnek için 31. portu seçtim). Daha sonra yine aynı not defterinden "ServerName localhost" ifadesininde bulup son kısmına belirlemiş olduğunuz port numarasını önüne ":" koyarak aşağıdaki gibi yazıp kaydedin. Şimdi Apache'yi Control Panel'den çalıştırabilirsiniz. 


Bu sunucuya ulaşmak için ise öncekinde olduğu gibi adres satırına "localhost:31" yazmanız yeterli olacaktır.


Görüldüğü gibi bilgisayarınızda iki farklı sunucuyu onlara farklı port değerleri vererek çalıştırabilirsiniz. Benim işime yaradığı ve çözümünü bulduğum için paylaşayım dedim. Eminin zaten çoğunuz biliyordur bunu ama bilmeyenler veya unutanlar için bir kenarda bulunsun.

Hepinize Kolay Gelsin!!!

@Emin_Ucer


22 Ocak 2015 Perşembe

Hadi Java Öğrenelim - Sınıflar #1

Sınıflar, nesne yönelimli programlama dillerinin işlevsel alt parçalarıdır. Basit programların yazımında çok ihtiyaç olmasa da yıllar ve bilgisayar teknolojileri ilerledikçe daha karmaşık ve büyük programların, oyunların ve işletim sistemlerinin yazımları zorlaştığı için ihtiyaçtan ortaya çıkmıştır. Sınıfların aslında temelde yaptığı şey kodunuzu organize etmek ve sizi ciddi anlamda zaman kaybından kurtarmaktır.

Örneklerle anlatmak her zaman daha keyifli ve kolaydır. Mesela bir oyun geliştirdiğinizi düşünün, bir çok oyun karakteri yaratmalısınız. İsimleri, kıyafetleri, güçleri, canları, kabiliyetleri, silahları... farklı farklı bir çok karakter. Bazen aynı karakterden de onlarca oluşturmanız gerekir. O zaman her karakter için defalarca belki de aynı tanımlamaları kullanarak satırlarca kod yazmak zorunda kalacaksınız. Bunun yerine bütün karakterleri türetebileceğiniz bir karakter sınıfı olduğunu düşünün. Hazır çikolata kalıpları gibi. Tek yapmanız gereken sıcak çikolatayı hazır kalıba dökmek. Belki ilk başta sadece o hazır kalıbı oluştururken biraz zaman harcayacak ama sonra her bir çikolata için aynı kalıbı  tekrar tekrar kullanacak ve büyük bir zaman kaybından kurtulacaksınız. Bu güzel bir örnek oldu aslında, sınıf yazmak bir nevi kalıp hazırlamaya benziyor. Bir kere yazın, istediğiniz kadar kullanın ve paylaşın.


Dahası sınıflar bundan çok daha fazlasını yapmanıza imkan verir. Mesela kullandığınız işletim sistemlerindeki butonlar, klasörler, pencereler vb. ilgili sınıflardan türetilmiş nesnelerdir. Her lazım olduğunda bir buton hazırlamazsınız, bir kere buton sınıfı yazar gerektiğinde de bu sınıfa ait bir buton nesnesi oluşturur ve kullanırsınız. Bununla kalmayıp, butonun ismini, aktifliğini, boyutlarını, işlevini de yine önceden tanımlanmış özellikler sayesinde değiştirebilir aynı kalıptan farklı çikolatalar çıkarabilirsiniz. 

Neyse işin edebiyat kısmı böyle işte. Kafanız karışıksa da biraz alıştırma yaparak daha iyi anlayacağınızı düşünüyorum ki zaten atla deve değil. Oldukça kolay, basit ve işlevsel bu şeyleri seveceksiniz.

Başlayalım
Birinci yazıda proje oluşturup, projemize sınıf  ve o sınıfa da main fonksiyonunu eklemeyi görmüştük. Nasıl olduğunu hatırlamak için o yazıyı tekrar okuyabilirsiniz. Şimdi oradan devam edelim ve projeye "karakter" adında yeni bir sınıf ekleyelim. 


Gerekli olan kodu eclipse'in kendisin oluşturduğunu gördük. Demek ki java'da sınıflar bu şekilde tanımlanıyor. Oldukça basit değil mi?

public class <sınıf_ismi> 
{

}

Buradaki "publicifadesi bir "modifier", modifierların ne olduğunu, ne işe yaradığını sonra öğreniriz, şimdilik geçiyorum.  Şimdi, oluşturacağımız karakterlere ait bazı özellikleri bu sınıf içinde tanımlayalım. Bunlar isim, yas, guc ve saglik olsun. Bu değişkenleri her bir karakteri oluştururken ben belirlemek istiyorum, ama takdir edersiniz ki sağlıkları varsayılan olarak 100 olsun. O halde kullanacağım yapı bir "constructor". Çok kısa olarak şöyle söyleyeyim, "constuctor" lar nesne oluşturulurken çağrılan ve adı sınıf adı ile aynı olan fonksiyonlardır. Yani bu sınıf içerisine bir fonksiyon yazacağız adı da "karakter" olacak, ama şu var ki bir sınıfta birden fazla constructor olabilir. Nasıl olur ? Eğer aldıkları parametreler farklı ise olabilir. Bunun farkını ilerki derslerde örneklerle daha iyi anlayacağız.


Bu kodda bir kaç önemli şey var, onları açıklayayım. Öncelikle dediğim gibi bir "constructor" yazdık. Yani sınıf adı olan "karakter" adında bir fonksiyon yazdık. Bu fonksiyonun parametreleri var; "isim","yas","guc". Fonksiyon içinde ise aldığımız bu parametre değerlerini sırasıyla "this.isim","this.yas" ve "this.guc" değişkenlerine atadık. Bunu neden yaptık ? "this" ne demek ? Aslında yapmaya çalıştığımız şey fonksiyon parametrelerinden aldığımız değerleri yukarıda belirlediğimiz değişkenlere atamaktı. Ama dikkat ederseniz parametre değişken isimleri ile üsteki değişken isimleri aynı. O halde "isim = isim" gibi bir atama yapamazsınız. Burada devreye "this" ifadesi giriyor. "This" kelimesi içinde olduğunuz sınıfı temsil eder. "This" kelimesinden sonra nokta koyarak o sınıfa ait değişkenlere sınıfın içerisinde herhangi bir yerde ulaşabiliriz. Böylelikle sınıfın kendi değişkenlerinin değerini "constructor" içerisinde değiştirmiş olduk. Parametre değişkenlerine farklı isimler vererek "this" kelimesini kullanmayabilirdik, ancak baştan bu ifadeyi öğrenelim diye bu örneği bilerek seçtim.

Son olarak bu dersi çok uzatmadan, oluşturduğumuz karakterlerin özelliklerini ekrana yazdıracağımız bir metot yazalım. İlgili metodu da(fonksiyon) yazdıktan sonra sınıfımız görüntüsü aşağıdaki gibi olacaktır. [Bu arada belirteyim Java'da fonksiyon yerine metot kelimesi tercih edilir, kafanız karışmasın metot dediğim şeyler aslında bildiğiniz fonksiyon rutinleri]


Ozellikler() fonksiyonu "void" değerli bir fonksiyon. Yani geri döndüreceği herhangi bir değer olmayacak, yapacağı tek şey formatlı bir şekilde isim, yas, guc ve saglik değişkenlerini ekrana yazmak. Ekrana yazma işlemini de yine geçen yazımda göstermiştim. Burada belki de tek bahsetmem gereken şey, formatlı yazı yazarken Java'da stringleri "+" ile kolayca birleştirebiliyor oluşunuz. Oldukça kolay ve güzel bir kullanım.

Tamam sınıfımızı hazırladık. Şimdi bu sınıftan bir nesne oluşturmak kaldı. Diğer bir deyişle kalıbımız hazır, çikolata üretmeye başlayabiliriz. O halde ilk derste oluşturduğumuz main() fonksiyonumuzun olduğu sınıfa gidelim ve aşağıdaki kodu yazalım.


Şimdi kodu analiz edelim.
Java'da var olan bir sınıftan nesne türetmek için;

<sınıf_adı> <nesne_adı> = new <sınıf_adı>(parametre_degerleri);

kalıbı kullanılır. Burada "jack" adıyla bir karakter oluşturmuş olduk. "=" den önceki ifadeye bakarsanız aslında bir değişken tanımlamak gibi, yani "int x, double z, String s" gibi. Yalnız bu kez değişken türümüz bir sınıf ve adıda "karakter". Öyleyse "karakter jack", karakter tipinde bir değişken tanımlar, işte buna da o sınıfın bir nesnesi denir.

"new" kelimesi, C dilinden hatırlayacağınız üzere "malloc" (memory allocation) komutuna karşılık gelir, yani oluşturulacak nesne için bellekte bir yer ayırır. "new" kelimesinden sonra gelen şey ise sınıf içinde, sınıf adıyla tanımlamış olduğumuz "constructor" metodudur. Aldığı parametreler, nesne yaratılırken doğrudan verilir. Böylece "jack" nesnesi oluştururken aynı zamanda, ismini, yaşını, gücünü parametre olarak vermiş ve nesnemizi "initialize" yani başlangıç değerlerini vererek kurmuş olduk. Aynı sınıftan başka bir karakteri de yine aynı şekilde, farklı parametrelerle (isim, yas, güc ve değişken ismi) oluşturabiliriz.

Son satırda bu nesnenin Ozellikler() metodunu çağırdık. Bunu yaparken aşağıdaki formatı kullandık;

<nesne_ismi> . <metod_ismi>(varsa paramatreleri);

Yani önce nesne ismini yazıyor, sonra "." koyuyor daha sonrada ilgili metodu(fonksiyon) yazıyoruz. Bu metotla karaktere atadığımız değerleri ekrana yazdırmış olduk. Bu kadar basit. 

Programı çalıştırırsak aşağıdaki sonucu göreceğiz. 



Kodları bilerek yazmadım ve doğrudan resim olarak koydum. Bunun nedeni ise tembelliği önlemek. Yazmadan, kopyalamak aklınızda pek bir şey bırakmaz bu yüzden öğrenmek için bakarak da olsa kendiniz yazın.

Kodlar içinde "public" gibi bazı tanımlamaları anlatmayı atladım. Bunları ilerde daha detaylı anlatacağım. Şimdilik bir çok temel konuyu anlattığımı düşünüyorum. Sonraki yazılarımda da sınıflarla ilgili işlemlere devam edeceğiz.

Esen kalın!!

eminucer@gmail.com




17 Ocak 2015 Cumartesi

Hadi Java Öğrenelim!!!

Ne zamandır başlayıp başlayıp bir türlü sonunu getiremediğim bir diğer konuda buydu. Popüler dillerden biri olan java'yı öğrenmek. Hep bir yere gelip bırakmak zorunda kaldım. Ama bu kez kararlıyım, umarım devamı gelir.

Size bir teklifim var. Gelin java'yı birlikte öğrenelim. Adım adım, yavaş ve kararlı. Java güzel bir dil. Elit bir havası var. Daha derli doplu. Bir kere platform bağımsız. Programlayın sonra nerde isterseniz çalıştırın. Ayrıca mobil dünyada da almış başını gitmiş bir dil. Herkes bu dille uygulama geliştiriyor. İnternette ise sayısız kaynak mevcut. Uzun lafın kısası öğrenmemek için hiç bir sebeb yok.

Peki nasıl olacak ?

Merak etmeyin programlamaya yeni başlıyor gibi gitmeyeceğiz. Eminim çoğunuz "C syntax" 'e aşinasınızdır. Java'da hemem hemen aynı kelimeleri kullanıyor. Yeri gelince farkları öğreniriz. Ama temel programlama kalıplarını (if yapıları, do-while-for döngüleri, fonksiyon yazma vs.) tekrar etmeye lüzüm görmüyorum çünkü vakit kaybı, bunu bildiğimizi varsayıp atlayalım. Örnekler ile aşina oluruz zaten.

Nerden başlıyacağız ?

Ben sınıflardan başlayalım diyorum. Çünkü java'yı java yapan şey bir nesne dili olmasıdır (OOP). [Aslında onu zor yapan şeyde bu, neredeyse herşeyi nesnelerle yapmak veya herşey için özelleşmiş bir nesne sınıfının olması öğrenirken bazen işleri çığrından çıkarıyor ;)] Eğer bu kısmı doğru öğrenebilirsek eminim herşey daha keyifli ve kolay olmaya başlıyacaktır.

Kurulum ?

Ben Eclipse kullanacağım (açıkçası şu an o var ve başka bir derleyiciyede alışmaya üşendim). Buradan java için bir eclipse indirip kurarak başlayın. Tabi önce Java geliştirme kitine ihtiyacınız olacak onuda şurdan şurdan edinin. Kafam karıştı diyorsanız, size zahmet şu sitedeki adımları ve altında ki videoyu izleyerek kurulumu yapın.

İlk Çalıştırma ve İlk Program

Eclipse'i çalıştırın. Aşağıdaki ekrandan File>New>Java Project seçin.


Karşınıza gelen pencereden projenize bir isim vererek "Finish" 'e tıklayın.Sonrda yukarıdaki resimde görünen "Workbench" simgesine tıklayarak çalışma sayfasına geçin. Çalışma sayfasındaki "Package Explorer"'dan projenizi bulun ve çift tıklayın. İçerisindeki "src" klasörüne sağ tıklayın ve yeni sekmesinden projenize bir "class" ekleyin.


Kaşınıza gelen ekrandan sınıfınıza bir isim verin ve aşağıdaki "public static void main(String[] args)" seçeneğinin işaretli olduğundan emin olun ve "Finish"'e tıklayın.


Artık projeniz ve main fonksiyonunuz hazır. Main fonksiyonu hakkında bir kaç şey söyleyelim. Java programları çalışacağı zaman ilk baktıkları şey main() fonksiyonudur. Daha doğrusu programı oradan çalıştırmaya başlarlar. Eğer bu fonksiyon projenizde yoksa programınız çalışmayacaktır. 

İlk java kodumuzuda yazarak bitirelim.


Java'da ekrana birşeyler yazdırmak için System.out.println("") komutunu kullanıyoruz. Yukarıdaki basit kodu yazıp yeşil zemindeki küçük beyaz oka basarak programı çalıştırın. Hemen aşağıda programın sonucunu göreceksiniz. Bu kadar !!!



Bu ilk kısımda bir java programının nasıl yazılıp çalıştırıldığını görmüş olduk. Diğer derste görüşmek üzere!!!

İyi çalışmalar

eminucer@gmail.com








Basit Bir Arayüz Devresi Tasarlayalım

Arayüz (Interfacing) nedir ? 

Aslında türkçesi bilgisayar ortamı için iyi duruyor olsada, elektrik devreleri için tam aynı şeyi söyleyemem. Yinede bunu kullanacağım. Arayüz yada Interfacing, teknik terim olarak bir ünitenin değeri ile ilişkisi, bağlanması veya uyumlu hale getirilmesi anlamına gelir. Elektronikte farklı gerilim seviyelerinde olan analog sinyallerin, sayısal olarak işleneceği dijital sistemler için gerekli olan gerilim seviyelerine uyumlandırılmasında da kullanılır. 

Şöyleki elinizdeki mikro denetleyiciniz 5-0 V gerilimde çalışıyor diyelim, bu durumda denetleyicinizde işleyeceğiniz her türlü analog sinyal, büyüklüğü ne olursa olsun bu seviyeye indirilmelidir ki örneklenebilsin. Diğer türlü verinin bir kısmını yada büyük bir kısmını kaybedebilirsiniz. İşte bu indirme işlemini gerçekleştiren devrelere arayüz(interfacing) devreleri denir ve hem analog hemde dijital sinyallerin olduğu karışık(mixed) sinyal devrelerinde kullanılırlar. 

Arayüzleme işleminde ana sinyaliniz bozulmamalıdır, yani herhangi bir distorsiyona uğramamalıdır. Diğer bir değişle bu işlem doğrusal (lineer) olmalıdır. [Doğrusallık mühendislikte önemli bir kavramdır. Bunula ilgili görüşlerimi başka bir yazıda sizlerle paylaşacağım] Buda bize arayüz devrelerinde olabildiğince doğrusal devre elemanları kullanmamız gerektiğini gösterir. Şanşlıyız ki istediğimiz doğrusallığı verecek elemanlarımız zaten var ve kullanımıda analizi kadar basit. 

Burada tasarımlarımda çok kullandığım, uygulaması ve anlaması basit bir arayüz devresini göstereceğim. Ama devreyi doğrudan vermek yerine isterseniz adım adım tasarlayalım.

Arayüz devrelerinin yaptığı iş aslında Shifting ve Scaling olarak bilinir. Türkçeye çarpma ve kaydırma olarak çevirelim (ki yapacağımızda bu zaten). Yani bir analog sinyal uygun bir reel sayı ile çarpılır ve sonra zaman ekseninde sabit bir (dc) sinyal ile toplanarak yukarı veya aşığıya kaydırılır. Örneğin sinyaliniz -8/8 V bir sinüs sinyali olsun ve sizde bunu 5-0 V bir sinüse çevirmek istiyorsunuz. O halde yapacağınız işlem -8/8 V sinyali önce -2.5/2.5 V seviyesine getirmek için 5/16 ile çarpmak daha sonra 2.5 V gerilim ekleyerek 5-0 V arasına getirmektir. Oldukça basit ve doğrusal olan bu işlemin blok gösterimi aşağıdaki gibi;


Şimdi bu işlemi minimum s0 ve maksimum s1 aralığındaki genel tanımlı analog bir sinyal için düşündüğümüzde K çarpanının ve b offset değerinin, bize 5-0 V seviyesinde gerilim vermesi için ne olmaları gerektiğini bulmaya çalışalım. 

Sinyalimiz maksimum değerini (s1) aldığında çıkışımız 5V, minimum değerini (s0) aldığında ise çıkışımız 0V olmalıdır. Bu durumu denklemle gösterecek olursak aşağıdaki ifadeyi elde ederiz.

İki bilinmeyenli bu denklemin çözümü ise bize K ve b değerlerini verecektir. 

Burdaki K ve b değerlerinin ikiside sabit sayıtlardır. Şimdi bu işlemleri lineer devreler üzerinde nasıl gerçekleştiririz ona bakalım.

Bir sabit ile çarpma işleminin yükseltmeye (amplification) karşılık geldiğini biliyoruz. Ama yapacağımız işlem yükseltme değil daha çok bölme olacak. Kazancı ayarlanabilen bir yükseltgeç fazlasıyla işimizi görecektir. Buda tahmin ettiğiniz gibi negatif geribeslemeli faz çeviren bir opamp yükseltici. Diğer yandan b değeride dc bir gerilime karşılık gelecek. Bu sinyali çarpma işlemini yapacağımız devrenin çıkışındaki sinyalle toplamamız lazım. Bu işlemide bir toplayıcı devre ile halledebiliriz.

Sonuç olarak devremiz bir yükseltgeç ve birde toplayıcıdan (summing amplifier) oluşan iki kademeli aşağıdaki opamp devresi.


Bu devrenin ilk kısmı K ile çarpma işlemini, ikinci kısmıda b ile toplama işlemini gerçekleştirir. K ve b değerlerini bulduktan sonra ilgili direnç değerlerini bulmak ise çok kolay, sadece biraz matematik ile oynamaya bakıyor. Çünkü devre lineer bir devre ve herhangi bir zaman sabiti de yok. Ama şuan bu işlemleri geçip formülleri veriyorum.




Dikkat ederseniz devrede bir s2 gerilimi daha verilmiş. Bu gerilim sizlere b sabitini oluşturmak için kullanacağınız referansı oluşturur. Yani devrenizdeki sabit gerilim her ne ise (3V, 5V, 9V, 12V vb), bu gerilimi s2 olarak kullanarak istediğiniz b offset değerini üretebilirsiniz.

Görsellere ve daha bir çok bilgiye ulaşmak için Robert Paz'ın aşağıdaki dersini izleyebilirsiniz.

Kolay Gelsin!!!

eminucer@gmail.com