7 Haziran 2015 Pazar

Kısa Kısa: HTML Nedir ?

HTML, web sayfalarındaki içeriklerin (yazı, resim, link, form vs) sayfa açıldığında nasıl gösterileceğini düzenleyen bir biçimlendirme dilidir.  Bir html sayfası, “tag” denilen ve sayfa içerisindeki nesneler ve sayfa özellikleri için belirlenmiş özel etiketlerden oluşur. HTML, bir programlama dili değildir, istemci tarafında web tarayıcı tarafından yorumlanır. Bu nedenle web tasarımdan kastedilen web programlamadan farklı olarak genelde sayfanın HTML içeriğidir.


İlk web sunucusu 1989 yılında World Wide Web’in yaratıcısı Tim Berners Lee tarafından CERN’de NeXT marka bir bilgisayarda kurulmuştur. İnternetteki ilk web sayfası olarak bilinen site ise şu an da http://info.cern.ch/hypertext/WWW/TheProject.html adresinden tekrar görülebilir.


Günümüzde HTML standartları W3C tarafından belirlenmektedir. İstemci ve sunucu tabanlı diğer web teknolojileriyle daha uyumlu çalışması ve daha dinamik web sayfalarının oluşturulması için sürekli geliştirilen HTML’in son sürümü ise HTML5’tir.




2 Mayıs 2015 Cumartesi

30 Mart 2015 Pazartesi

Bilgisayar Grafikleri ve Rendering

İlk bilgisayarlardan günümüze şüphesiz gözle görülebilen en büyük değişim bilgisayar grafiklerinde yaşanmıştır. Görüntülerin, ilk yıllarda sadece hesap yapma ve veri yönetimi gibi görevler için geliştirilen basit metin tabanlı grafiklerden zamanla göz dolduran ve çoğu zaman gerçekle ayırt edilemeyen 3 boyutlu grafiklere evrilmesi benim gibi çoğu kişinin de merakını cezbetmiş bir süreçtir. Bu sürecin arkasında her yıl giderek artan bilgisayar hızları ve işlemci kabiliyetleri yanında görüntü motorlarının beyni olan matematik modellerinin de büyük payı vardır. Gerçekçi, kaliteli ve ayrıntılı görüntülerin hızlı bir şekilde üretilmesi (bilgisayar oyunları, animasyonlar ve görsel efektler) için bu modellere ait denklemlerin hızlı bir şekilde çözülmesi ve uygun verilerle işlenmesi gerekir. Sanıldığının aksine bir tek görüntü için bile birçok hesap (ışık kaynağına göre parlaklık, gölgeleme, yansıma, iz düşüm vs) yapılır ki bu da birçok görüntünün iç içe girdiği ve anlık üretilmesi gereken uygulamalarda çok yüksek bir işlem gücüne ihtiyaç olduğunun kanıtıdır.



Peki nedir bu grafik işlemleri ? Tabi ki hepsinden bahsetmek imkansız (eğer ilginiz varsa "Bilgisayar Grafikleri" ile ilgili dersler almanızı veya "Fundamentals of Computer Graphics - P. Shirley, S. Marschner" kitabını okumanızı tavsiye ederim), bu yüzden bu yazıda sadece rendering'den bahsedeceğim.

Rendering, bilgisayar litaretüründe 3D bir modelin 2D görüntüsünün (resminin) elde edilmesine denir. 3D bir modeli niye 2D'ye çeviriyoruz diyebilirsiniz, dikkat edin 3D bir görüntüyü değil bir modeli görüntüye çeviriyoruz. Bunu bir ressamın veya sanatçının gördüğü bir nesneyi tuvaline resmetmesi gibi düşünebilirsiniz. Nesneler 3 boyutludurlar ama görüntüleri her zaman (hologramlar istisna) 2 boyutlu düzlemlerde veya yüzeylerde görüntülenir. Aynı şey bilgisayarlarda da gerçekleşir. Nesneler 3 boyutlu uzayda matematik vektörleri ve yüzeyleri ile ifade edilerek modellenir. Pekala bu nesnenin herhangi bir gözlem noktasından bakıldığında gözde oluşacak 2 boyutlu görüntüsü nasıl oluşur ? İşte rendering böyle bir soruya cevap veren bilgisayar algoritmasıdır.



Eğer rendering'i bir fonksiyon gibi düşünürsek belki de şu şekilde tasvir edebiliriz;

"Uzaydaki herhangi bir nokta ve o noktadan çıkan bir yön vektörünü, bir görüntü matrisine (resim) götüren işleme denir."

Bu tanım benim tamamen kendi kafamda basitleştirdiğim bir anlama karşılık gelir. Gerçekte böyle bir işlem için yukarıda da bahsettiğim gibi ışık, yansıma, konum, hareket gibi bir çok parametrenin de dahil olduğu daha karmaşık fonksiyonlarla icra edilir.



Uzayda kırmızı renkli bir küp düşünün. Tabi bu küpü görebilmek için ise bir ışık kaynağı hayal edin, bu kaynağı dilediğiniz yere yerleştirebilirsiniz. Bu küpü zihniniz hemen iki boyutlu bir görüntüye çevirecektir. Çünkü tüm yönlerini bir anda görmeniz imkansızdır. Şimdi küpe farklı açılardan, yerlerden ve uzaklıklardan bakın. Her hareketinizde görüntünün değiştiğini görürsünüz. Bazı yerlerde tek kenarını, bazen iki, bezense üç kenarını birden göreceksiniz. Yine bulunduğunuz yere ve küpün ışık kaynağına göre konumundan dolayı farklı kenarlar farklı derecelerde gölgeli görünecektir. Ayrıca radyal hareketlerde görüntünün boyutu sabit kalırken küpten uzaklaşırken veya ona yaklaşırken yapacağınız doğrusal hareketler gözünüzde oluşan küpün boyutunu da değiştirecektir. Şimdi aynı uzaya bir de küre ekleyelim. Kürenin kendine has geometrisi, yüzeyi, ışık tepkisi gibi bir çok farklı parametresinden dolayı tüm bu hareketlerde farklı görüntüler elde edeceksiniz. Mesela kenarları olmadığı için uzaydan hep daire şeklinde görülecek veya ışığa maruz kaldığında bir yarı küresi karanlıkta kalacaktır. İşin zor tarafı ise bundan sonra başlayacaktır. Uzaya koyduğunuz her nesne diğer tüm nesnelerin görüntülerini etkileyecek, bazen yansımalarla bir ışık kaynağı gibi davranırken bazen de ışığı önleyen bir engel görevi görecektir. Ayrıca bu nesnelerin olası hareketleri de yine tüm değer kümesinin elemanlarını değiştirecek, görüntülerin tekrar hesaplanıp üretilmesine neden olacaktır. Zihninizin anlık yaptığı tüm bu işlemleri bilgisayarlara yaptırmak ise azim, tecrübe, akıl ve kurursuz bir mühendislik gerektirir.



Gördüğünüz gibi sadece iki nesneli ve bir ışık kaynağı olan uzay modelinin farklı noktalardan 2 boyutlu resmedilmesinin altında bile çok ince, hassas ve ileri seviyede hesaplama ve işlem gücü yatar. Bu durum bilgisayar oyunları gibi (ki bu oyunlarda değişen, hareket eden, ortaya çıkan/kaybolan binlerce nesne vardır), bu türden işlemlerin her saniye başına 30-40 (fps) kere yapılması gereken uygulamalarda özelleşmiş grafik işlemcilerin (ekran kartları) kullanılmasını gerektirmiştir. Böylece tüm bu işlemler merkezi işlem birimini meşgul etmeden, bu iş için özel tasarlanıp üretilmiş, çok çekirdekli matematik işlemcilerinde paralel bir biçimde icra edilirler.



Rendering, 3 boyutlu modellemelerin kullanıldığı hemen hemen her program tarafından yapılan bir işlemdir. Bilgisayar oyunları ve bilgisayar destekli çizim programları, özel film efektleri, animasyon filmler ve daha nice uygulamarlarda tasarlanan her 3D model ekrana bir takım rendering işlemlerinden geçirilerek (bkz:perspektif) 2 boyutlu olarak yansıtılır. Yani her zaman dediğim gibi işin mutfağında büyük bir emek vardır.

Bu konuda araştırma yaparsanız özellikle animasyon şirketlerinin, oyun ve film üreticilerinin oldukça keyif alarak izleyebileceğiniz videolarına rastlayabilirsiniz. Çoğu film için "sahne arkası" çekimleri, oyun motoru tasarımları, animasyon hazırlama kursları ilginizi çekebilir. Ayrıca bu iş için matematik bilginizi de canlı tutmanız ve doğrusal cebir ve analitik geometri gibi konulardan da keyif almanız gerekebilir.




Eğer programlama kısmına kendinizi yakın hissediyorsanız, OpenGL öğrenmeniz ve kendi 2 boyutlu oyunlarınızı kodlamanız oldukça eğleneceğiniz ve tecrübe kazanacağınız aktiviteler olacaktır.

Aşağıda fikir edinmek ve motivasyon kazanmak için izleyebileceğiniz videoları paylaşıyorum.

Hepinize iyi eğlenceler ve iyi çalışmalar.

@Emin_Ucer












22 Mart 2015 Pazar

Bilgisayar Ağlarında Latency Nedir ?

Latency, bilgisayar ağlarında bir mesajın bir bağlantı üzerinden iletilmesinde oluşan toplam gecikme anlamına gelir. Siz tarayıcınızda bir linke dokunduğunuzda yada tıkladığınızda bir takım veri transferi gerçekleşir. Sonuçta verilerin bir noktadan diğerine fiziksel olarak gitmesi ve geri gelmesi gerekir. Bu geliş ve gidişler belli süreler içerisinde olurlar ve buda anlık cevaplar yerine gecikmeli cevaplar demektir. Verinin iletimini tamamlayıp istenildiği yere ulaşma süresi internet bağlantınızın hızını belirleyen önemli bir değişkendir. Bir internet sayfasının yüklenme süresinin bir kaç saniye alması çok büyük bir sorun olmazken online bir oyundaki bir kaç yüz mili saniyelik bir gecikme keyfinizi kaçırabilir. Peki bu gecikmeye neden olan şey nedir ? Nasıl tanımlanır ve hesaplanır ? 


 Latency'i belirleyen iki temel gecikme vardır. Bunlar;

1) İletim Gecikmesi (Transmisson Delay)
2) Yayılma Gecikmesi (Propagation Delay)

İletim gecikmesi M bitlik verinin iletim kanalına konulmasında geçen süredir. 

T = M (bits) / R (bits / saniye)

bu denklemde R veri transfer (data rate) hızını temsil eder ve iletimin bant genişliğini gösterir. Basitçe 1 Mbps'lık bir bağlantı 56 kbps'lık bir bağlantıdan aynı miktar veri için çok daha az bir gecikme oluşturacaktır.

Yayılma gecikmesi ise iletim kanalındaki verilerin hedef noktasına ulaşması için geçen süredir. Aradaki mesafenin, elektromanyetik dalganın hızına bölünmesiyle bulunur.

D = Uzunluk (m) / sinyalin kanaldaki hızı (m/saniye)

bu gecikme iletim ortamının fiziksel özelliklerince belirlenir. Örneğin kablosuz yada fiber optik bir iletimde, iletim hızı ışık hızındayken kablolu bir bağlantıda bu hız ışık hızının yarısı kadardır. Böyle olunca kablosuz ve fiber optik iletimlerde gecikme daha az gerçekleşir. Yalnız özellikle kablosuz iletimde hata olasılığı oldukça yüksek olduğunda hata algılama ve düzeltme işlemleride gecikmelere neden olacaktır.

Bu iki gecikme toplam Latency'i verecektir.

L = T + D



Örnek olarak bir dial-up bağlantıyı düşünelim. Bu tür bir bağlantının veri hızı R = 56 kbps'dır. Eğer M=1250 Byte'lık bir mesajı yayılma gecikmesi D=5 ms olan bir kanal üzerinden yollarsak;

L = 5 ms + 1250 x 8 bits / 56 x 1000 bits / saniye
L = 5 ms + 179 ms = 184 ms

184 ms'lik bir gecikme sonunda hedefine ulaşacaktır. 

Görüldüğü gibi gecikmenin önemli bir kısmı iletim gecikmesinden kaynaklanmaktadır. Bunu azaltmak için iletim hızı yüksek bir bağlantı deneyelim.

Örneğin bu kez geniş bant bir bağlantı düşünün. Veri hızı R = 10 Mbps olan bu bağlantının yayılma süresi ise D = 50 ms olsun. Yine aynı mesajı (M=1250 Byte) göndönderdiğimizi varsayarsak;

L = 50 ms + 1250 x 8 bits / 10 x 10e6
L = 50 ms + 1 ms = 51 ms

51 ms'lik bir gecikme ile iletim gerçekleşecektir.

Bu kez de gecikmenin büyük bir kısmı yayılma gecikmesinden kaynaklanmıştır.

Sonuç olarak gecikmenin başlıca nedenleri uzun bağlantılar ve düşük veri hızı olarak söylenebilir.

Bunlarla birlikte kullanılan diğer bir kavram da Bant Genişliği - Gecikme çarpımıdır. Bu kavram iletim hattının depoladığı yada taşıdığı veri miktarını gösterir.

BD = R x D

olarak hesaplanır. R yine veri hızını (data rate), D ise yayılma gecikmesini temsil eder.

Örnek olarak, R = 40 Mbps ve D = 50 ms olduğu bir iletimin taşıma kapasitesi;

BD = (40x10e6 Bits /saniye) x (50x10e-3 /saniye) =  250 KByte'tır. 

Yani bu kanal, iletim yaparken içerisinden 250 KB'lik bir veriyi fiziksel olarak tıpkı bir depolama aygıtı gibi saklayabilmektedir.

Latency'nin, internet bağlantınızın hızını nasıl etkilediğini öğrenmiş oldunuz :)

Hepinize İyi Çalışmalar

@Emin_Ucer




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