18.12.2010

Model View and Controller Deseni Nedir ?

Bu yazımda büyük projelerin bundan sonra olmazsa olmazı, ilk kullandığımızda bize çok karmaşık gelecek; ama zamanla kullandıkça ne kadar çok yararlı olduğunu anlayabileceğimiz bir desenden bahsedeceğim.



MVC

        Genellikle büyük çaplı projelerde kullanılan bir desendir  ve katmanlı yapıyı destekler. Classları görevlerine göre sınıflarına ayırır peki  bu bize ne sağlar ? Öncelikle projenin kontrolü kolaylaşır binlerce satır kodu yönetmek biraz daha kolay hale gelir, performans da sağlar, daha güvenli bir yapı oluşturur. 
MVC mimarisinden dolayı; iş mantalitesini ve görünümü birbirinden izole etmiş olur.




Model: 

Veritabanıyla yapılacak tüm veri alışverişini bu katman sağlamaktadır. Oluşturduğumuz veritabanı şeması sayesinde veritabanımızdaki tüm tablolar ve ilişki olduğu başka tablolar field'larına kadar Class yapısına dönüştürülür ve bir dosyada saklanır. Sadece Controller katmanı ile çalışır. Güncel hayattan örnek vermek gerekirse mesela biz  üşüdüğümüzü hissettik. Bu durumda biyolojide az çok görmüştük ne olur ? Öncelikle 5 duyu organımızdan birisi olan deri bunu algılar, sonra sinirlerle beyne gönderir ve  beyinde gelen bilgiler incelenip üşüdüğümüz kanısına varılır ve gerekli cevap yine sinirlerle duyu organımız olan deriye aktarılır ve titreme ya da benzeri bir üşüme tepkisi gösterilir. MVC modelinin bu gerçek hayattaki işlemeden hiçbir farkı bulunmamaktadır. Buradaki olayın mantalitesi dışarıdan alınan duyular içeride(beyinde) işlenir ve geriye bir sonuç(tepki) döner ve ne olup bittiğini dışarıdaki anlayamaz, böylece bizim işlemlerimiz izole edilmiş olunur;)  


Controller: 
Kullanıcı tarafından gelen ya da kullanıcıya döndürülecek verinin işlenmesi bu katmanda yapılır. 

View: 
Kullanıcı arayüzünün bulunduğu layerdır  görevi gösterilecek olan tepkiyi (veriyi) dışarıya sunmaktır.

Kullanıcı > View > Controller > Model > Controller > View > Kullanıcı

        MVC mimarisi ilk olarak JAVA tarafından geliştirilmiştir. Bu başarılı mimariyi Microsoft'da Framework 3.5 sürümü ile piyasaya sunmuştur. Yeni sürümleri hızla geliştirilmekte olup MVC2  piyasaya sürülmüştür ve diğer yeni sürümler için çalışmalar yapılmaktadır.

Büyük projelere katkıları:
- Kod karmaşıklığını çözmek en büyük amacı olduğundan; daha düzenli, daha anlaşılır ve daha sistematiktir.
- Kod karmaşıklığı çözüldüğü için performans artmaktadır.


Kısa bir örnekle açıklamak gerekirse;
Kullanıcı http://herhangibiradres/iletisim.xml  şeklinde bir request'te bulundu benim kullandığım MVC mimarisi bu isteği aldı frameworkde nereye gideceği yazılı olduğundan bu isteğin işlenmesi gereken Controller'a gitti bu da genellikle servletlarımızdır(Java classları) burada işlendi ve return olarak bize contact.jsp'yi gönderdi ve burada da gerekli bilgiler mevcut. Kullanıcının gönderdiği request http://herhangibiradres/iletisim.xml iken geriye dönen cevap http://herhangibiradres/contact.jsp ve kullanıcın görüntülemek istediği verilerde ekranda..

Burada servleta gelen istek, isteğin orada işlenmesi ve döndürdüğü response izole edilmektedir.
Büyük web projelerinin olmazsa olmazıdır:)

Teşekkürler..









12.12.2010

Aspect Oriented Programming'e Bakış

   Aspect Oriented Prog.(Bağlam Yönelimli Programlama) yeni nesil programlama mantığı olarak görülmektedir, yazılım dünyasının hergün gelişen ihtiyaçlarına cevap vermek için tasarlanmış yeni bir mantalite denilebilir.

  Önce fonksiyonları keşfeden yazılım dünyası birçok ihtiyacını bu fonksiyonlar sayesinde gidermiş; ama zamanla isteklerin çoğalması, daha kapsamlı kodlama yapılması ihtiyacı; Nesne Yönelimli programlamayı çıkarmıştır.

  Uzun süreden beri ihtiyaçlara cevap veren bu modelle, kodlamada modern dünya gibi düşünülüp, herşey nesne tabanlı modellenmiş ve fonksiyonel programlamaya göre daha kapsamlı ve daha esnek yazılımlar ortaya çıkmıştır.

  İlerleyen zamanla, OOP de ihtiyaçlara cevap veremez duruma gelmiştir, yakın zamana kadar çoğu yazılımın baştacı olan bu mantalite yerini yavaş yavaş AOP'ye bırakmaktadır. Peki nedir bu AOP ?

Bu yazımda biraz olsun bilgi vermeye çalışacağım :)


   Yazılım mühendisliğinde kullanılan bir programlama yaklaşımıdır. Türkçe literatüründe bağlam /cephe/ kesit /görünüm yönelimli programlama kelimelerinin hepsi farklı kaynaklarda kullanılmıştır.(Bağlam Yönelimli daha hoşuma gitti).  1990'lı yılların ortalarında özellikle JAVA ve nesne yönelimli programlama ile ivme kazanmış bir yaklaşımdır. Kısaca AOP’yi tanımlamak gerekirse bir program geliştirilmesi sırasında iki farklı yaklaşım görülmektedir.

 *Birinci tip yaklaşım fonksiyonel ve programın yapacağı işlere ait yaklaşımdır. Yani programı yazdığımızda ve program çalıştığında karşılayacağı ihtiyaçlar, yapacağı işlemler şeklindeki ve iş mantığı (business logic) olarak isimlendirilebilecek bakıştır. 
 *İkinci bakış ise teknik bakıştır (technicak concerns) yani programın çalıştığı ortam, işletim sistemi, veri tabanı gibi unsurlardır.
    Aop kısaca bu iki unsurun programa başlarken birbirinden ayrılmasını ve sonradan modüler olarak bu iki yapının birleştirilmesini sağlar. AOP sınıfların; metotlarını ve özelliklerini sadece hangi bakış açısıyla modelleneceğini belirler.
Kod yayılması (Code scattering):
Kestirme Fonksiyonellikler (Crosscutting Functionalities)
Yukarıdaki bu iki durumda klasik OOP yaklaşımının AOP yaklaşımına göre geri olduğu söylenebilir. Öncelikle Fonksiyonel programlama ortaya çıkar ve bunun zamanla yeterli olmadığı anlaşılır. İlerleyen zamanda bu fonksiyonelliğe nesneye yönelim eklenir OOP ve Nesneye yönelimli programlamanında yeterli olmadığı görülünce son model olarak söylenen durum AOP'dir. AOP bir adım daha öteye giderek  -->  Noktakesim(pointcut),  Birleşme noktası(joinpoint)  &&  tavsiye(advise) eklentilerinde bulunuyor.


Şimdilik kısa bir giriş yaptık, ilerleyen zamanlarda bu konuyla sık ilgileneceğiz ;)



Teşekkürler..

10.12.2010

Apache Tomcat'e Detaylı Bakış

Apache Tomcat
               Javayla web uygulaması geliştirmek isteyenlerin en çok kullandığı client sunucusu diyebiliriz. Developerı biraz uğraştırır; ama bu uğraşmaya da alıştıktan sonra zamanla sevilir. J
Yazdığımız tüm kodlar buraya gider ve burada derlenir bize browserda çıktısını verir Tomcat. Bir açık kaynak kodlu yazılım topluluğu olan Apache Yazılım Topluluğu’nun  geliştirmiş bir servlet  container /servlet barındırıcıdır.
Yapısına bakmak gerekirse 3 ana bileşeni bulunmaktadır(4.X sürümlerinin  4.1.31’nden bahsediyorum):
            Coyote :
   Tomcat’in Http bağdaştırıcısı, kullanıcıdan ya da Http proxyden (TCP portlarından) gelen istekleri ayrıştırarak Catalina(Java’lar buraya yönlendirilecektir.) ve Jasper’e(Jsp’ler buraya) yönlendirir. Aynı şekilde Catalina ve Jasper’den gelen bilgileri de görüntüleyebileceği sayfalar halinde kullanıcıya gönderir.(Kullanıcı ile işlem yapan kısım arasında ara katman denilebilir)                Coyote, Tomcat’in dönüştürme ve iletişim işlerini yapan front end uygulama kısmıdır.
            Jasper:
   JSP motorudur, JSP sayfalarını alır, ayrıştırır ve derleyebileceği şekillerde Catalina’ya gönderir.(Şöyleki; JSP’deki java classlarını servletleri gönderir, html gibi java classı olmayan bileşenleri kendisi yorumlayabilir).  Çalışma zamanında (runtime) Jasper eğer JSP üzerinde bir değişiklik algılarsa bunu alır ve yeniden derler.
Catalina:
   Tomcat’in Servlet Container’ı yani özü ,Tomcat servlet içeren sayfalar için en iyi servlet containerdır ve bu işi de Catalina yapar.(Esas işi yapan kısım denilebilir, java classlarını burası anlar, ayrıştırır ve feedback olarak diğer birimlere gönderir).,

Aşağıdaki resimde yukarıda bahsedilenler ve Tomcat'in iç yapısı gösterilmektedir,



Teşekkürler ;)

8.12.2010

Hibernate Nedir ?

   Öncelikle bu konu hakkında pek bilginiz yoksa, bu bahsedeceğimiz Hibernate Ne değildir sorusuna cevap verelim sonra gerekli açıklamalara geçelim.
*Windows'un kapatma seçeneği olan bilgisayarı kapatırken ram'deki tüm veriyi harddiske atan seçenek gelebilir aklınıza, bu da güzel bir seçenektir bilgisayarımız hızlı açılır farkedilir biçimde ama bu hibernate'den bahsetmeyeceğim..( not: Veriler hdde kayıtlı olduğundan, notebookun pilinin de şarjının da bitmesi durumunda dahi, verilerin kaybolmamasını sağlayan güzel özellik:)
*Latince kökenli olan hibernatusi yani kış uykusuna yatmak da değil bu bahsedeceğimiz Hibernate.
~ ~ ~ ~
   Bir ORM aracı olan (Object Relational Mapping), çok kullanışlı, transaction yönetimini kendisi yapan orta katman bir framework diyebiliriz. Bizim veritabanımız var ve biz buna ulaşmak istiyoruz, database ile aramızda
bir framework olan Hibernate bize birçok kolaylıklar sağlamaktadır, hız bakımından artısı yok denilebilir ama kod yazan bir Java'cı için kodları azaltmak demektir Hibernate:)

-ORM, nesne odaklı (object oriented) dillerdeki nesnelerin, ilişkisel veritabanlarındaki (relational databases) kayıtlara nasıl karşılık geldiğini yürüten bir teknolojidir kısaca.
-Hibernate gibi ORM araçlarıyla, bir nesneyi veritabanına kaydetmek, yeni halini güncellemek ve sorgulama yapmak düz SQL bağlantılarına göre çok kolaydır ve bu zamana kadar yazmış olduğumuz klasik sql sorgularını kullanmıyoruz.

Örneğin, JDBC ile veritabanına bir kayıt eklemek için aşağıdakine benzer bir kod yazılır:
stmt.executeUpdate( "INSERT INTO KAHVE VALUES ('Turkish', 101, 9.99, 0, 0)");

Burada, "KAHVE" tablosuna bir kayıt eklenmekte, böyle bir işlemi Hibernate ile yapmak için:
session.saveOrUpdate(kahve);
kahve, bildiğimiz düz bir java nesnesidir (POJO - Plain Old Java Object).

-Hibernate gibi ORM araçlarının en önemli faydası, kod yazmayı kısaltmak veya kolaylaştırmanın yanında, yazılım bakımını kolaylaştırmasıdır.  Veritabanı temelli uygulamalarda, kodun 1/3´ü veritabaný erişimine yöneliktir diyebiliriz:)

-Veritabanındaki bir kolonunun tipinin değişmesi, yeni bir kolon eklenmesi gibi değişiklikler, bütün veri erişim kodunu tekrar gözden geçirmeyi gerektirir. Hibernate ile bu gözden geçirmeden çok yüksek oranda tasarruf edilebilir.

- Hibernate kullanılan yazılımlarda, veritabanındaki değişikliklerde yapılması gereken sadece nesnelerle tabloların birbirine nasıl eşleştirildiğinin (mapping) gözden geçirilmesidir.(Mapping iki türlü olmaktadır, yeni çıkan mapping yöntemi olan annotationdan sonraki yazılarda bahsedeceğim inş.)

**Hibernate ile alakalı bazı bilgiler vermeye çalıştım, kullanmıyorsanız ve bilginiz yoksa zaman kaybetmeden bakın derim ;)

Teşekkürler..

JSP'nin Yorumlanmasına özet Bakış

   Jsp'de sadece Html kodları arasına Java kodları yazarak programming yazmak zordur. Bu zorluktan mütevellit, Jsp bize Java kod blokları yazmayı da sağlar.

Bu işlemi <%  //INSERT CODE    %> ile yaparız ve bunlara scriptlet denmektedir.

Eğer scriplets'den html kodu üretmeyi istiyorsak bunu out ile yapabilirz.
out.println(String.valueof( date )); //Example

Yukarıdaki scriplets'de bulmuş olduğumuz date variables'ını burada kullanabiliyoruz.
                                        
  ~ ~ ~ ~ ~ ~


                                    Mixing Scriplets and Html
<TABLE>
<%

int n = 5;

for( int i=0; i<n; i++)
{

%>

<TR>

<TD>Number=<%= i+1 %></TD>

</TR>

<% } %>

</TABLE>

   ~ ~ ~ ~ ~ ~
*Aynı zamanda kütüphanelerin import edilmesi durumu da farklıdır.
Normal Java'da import java.util.* şeklinde import edilirken; Jsp'de <%@page contentType="text/html; charset=cp1254" pageEncoding="cp1254" import="com.mtb.util.*"%>  şeklinde edilmektedir.

Jsp direktifleri <%@ ile başlar ve yukarıda da gördüğümüz gibi bu direktif bir "page direktifidir".



    ~ ~ ~ ~ ~ ~

<%@ include file="somePageOfText.text" %>  -->Bu .jsp sayfasına herhangi birşey ekleme ve çıkarma gibidir. Bir dosyası buraya yapıştırıp içeriği generate etmeden önce,  merge eder..


<jsp:include page="loginKontrol.jsp"/>-->Farklı servletlar çalıştığı zaman bu action kullanılabilir.

<%@include file="herhangibirsey.herhangibiruzanti" %>
Yukarıda ise eklenme direktifi mevcut olmakla birlikte, eklenen herhangi uzantılı dosyanın tek başına çalışması beklenmez. Bu direktifdir sadece!                                                                                                                                              

                   <<<  JSP DECLARATIONS  >>>
Bu Deklarasyon içerisine degisken ve metot ekleyebiliriz.!

<%@ page import="java.util.*" %>
<HTML>
<BODY>
<%!
    Date theDate = new Date();
    Date getDate()
    {
        System.out.println( "In getDate() method" );
        return theDate;
    }
%>
Hello!  The time is now <%= getDate() %>
</BODY>
</HTML>

*Declaration'un scriplets'den en mühim farkı load aşamasında bir değer alır ve daha sonra biz ne kadar reload etsek de bu değer değişmez. (Java'da ki final anahtar kelimesi gibi)

Halbuki scriplets'de olaylar bu şekilde değildir!


<td>Going to include solbar Buarad!.jsp...<BR>
<jsp:include page="incLeftBar.jsp"/></td>

Bu kodu istediğim sayfaya ekleyerek, bu satır içerisinde incleftbar.jsp'yi görebilirim..
yani incLeftBar.jsp sayfasını buraya include etmiş oluyorum.

*Şimdi de -> <td><jsp:forward page="index.jsp"/></td> Buradaki forward ne işe yarar ona bakmamız lazım,

Açıklama: Bu <jsp:forward page="index.jsp"/> ise hangi sayfada yazılırsa bu sayfayı index.jsp'e forward etmektedir.





JSP'DE SESSION TUTMA VE TUTULAN SESSION'LARIN GÖSTERİLMESİ



<HTML>
<BODY>
<FORM METHOD=POST ACTION="SaveName.jsp">
What's your name? <INPUT TYPE=TEXT NAME=username SIZE=20>
<P><INPUT TYPE=SUBMIT>
</FORM>
</BODY>
</HTML>
--->Buradan username SaveName.jsp'e gider..
--->SaveName.jsp'de aşağıdaki şekilde tutulur,

<%
   String name = request.getParameter( "username" );
   session.setAttribute( "theName", name );
%>


Mesela bu sayfadan başka bir sayfaya yönlendirme yapıldı ve tutulan sessions nasıl retrieved olacak onu görelim

--->Yönlendirilenpage.jsp'de sessionları şu şekilde okuyabiliriz;
<HTML>
<BODY>
Hello, <%= session.getAttribute( "theName" ) %>
</BODY>
</HTML>

Jsp'yi özet bir şekilde, çok detaya girmeden açıklamaya çalıştım,

Teşekkürler.

14.03.2010

Java ~ Polimorfizm

  Java'da polimorfizm kavramını iyi anlayabilmek için öncelikle Kalıtım anlaşılmış olması gerekir, kalıtımı kısaca özetlemek gerekirse bir class, başka bir classtan extends oluyorsa base classın tüm özelliklerini(private olmayan) miras alır + kendi özellikleri olabilir.

 Polimorfizmi kavramak için kalıtım dışında en mühim konu Geç bağlamadır. Geç bağlamayı şöyle özetleyebiliriz, Java kodumuzu yazdık, derleyeceğiz sıkıntı yok buraya kadar  peki çalışma esnasında ne olacak hangi metot çağrılacak, neler gerçekleşecek bunlar compile anında belli ise erken bağlamadır; ama polimorfizmde compile esnasında ne olacağı belli değildir bu geç bağlamadır. Çalışma anında gerçekleşen tetiklemelere göre program çalışacaktır. Birazdan bunları kod üzerinde daha anlaşılır şekilde izah etmeye çalışacağım.

  Java dilinde polimorfizmin anlaşılması için gerekli olan kalıtım bilgisi + late binding dışında diğer konu upcasting(yukarı doğru çevrim) olsa gerek. Biz yavaş yavaş işi koda dökerek oradan anlatmaya çalışalım:)

Örneğimizden yola çıkarsak

class yer
{
    public yer()
    {
        System.out.println("Ben Sadece Bir Yerim");
    }
    public void goster(){
        System.out.println("**yer classındayım şu anda");
    }
}

//İLÇE CLASSI
class ilce extends yer
{
    public ilce()
    {
        System.out.println("İlçe Bir Yerdir");
    }
    @Override
     public void goster(){
        System.out.println("**ilçe classındayım şu anda");
    }
}

Yukarıda iki tane classım var sadece. ilce classı extends olmuş yer classından.
Ben şimdi aşağıda az önce yazdığım iki tane classı(yukarıdaki) kullanarak upcast edeceğim.

public class ulke  {
   public ulke()
   {
       System.out.println("Burası Türkiye :)");
   }


    public static void cagir(yer m)
   {
    m.goster();
   }
    public static void main(String[] args) {
       yer y1= new yer();
       ilce Söke= new ilce();
       cagir(y1);
       cagir(Söke);// Upcast var!
}
}
  Upcast'teki olay tam olarak benim ulke classı içerisinde static bir metodum var  ve benden beklediği yer tipinde bir değişken ve ben bu metodu ona ilce tipinde Söke değişkenini göndererek de çağırabildim:)
Burada bir terslik var diyebilirsiniz; ama Java bunu anlıyor. Çünkü kalıtım bilgisinden hatırlayalım kalıtımda önemli olan "is a" ilişkisidir. Java diyorki sen bir static metot yazmışsın ve 'yer' tipinde parametre göndereceksin cagir(Söke); dediğin zaman ben önce 'Söke' değişkeninin tipine bakarım, baktım ki 'ilce' tipinde sonra 'ilce' classına bakarım o da 'yer' 'den extends olmuş o zaman her 'ilce' bir 'yer'dir. "is a" ilişkisi vardır ve sen bu şekilde kullanabilirsin der bize.

  Upcasting'de az çok anlaşıldıktan sonra, polimorfizme geçebiliriz kodda.

class yer
{
    public yer()
    {
        System.out.println("Ben Sadece Bir Yerim");
    }
    public void goster(){
        System.out.println("**yer classındayım şu anda");
    }
}

//İLÇE CLASSI
class ilce extends yer
{
    public ilce()
    {
        System.out.println("İlçe Bir Yerdir");
    }
    @Override
     public void goster(){
        System.out.println("**ilçe classındayım şu anda");
    }
}


public class ulke  {
   public ulke()
   {
       System.out.println("Burası Türkiye :)");
   }
    public static void cagir(yer m)
   {
    m.goster();     -------polimorfizm burdadır.

   }
    public static void main(String[] args) {
       yer y1= new yer();
       ilce Söke= new ilce();
       cagir(y1);
       cagir(Söke);// Upcast var!

}

  Biz static  cagir metodumuz içerisinden gelen parametreye göre goster metodunu çağırıyoruz; ama burada cagir(Söke) dediğimiz zaman çalışan goster() ile cagir(y1) dediğimiz çalışan goster aynı değildir.
Java bu metot içerisinde m.goster() dediğimiz zaman parametre olarak gelen m değişkeninin heap bölgesinde hangi classa bağlandığına bakar ve ondan sonra o classa ait olan goster metodunu çağırır.cagir(Söke) dediğimizde Söke değişkeni,   ilce Söke= new ilce(); kodu ile heap bölgesinde ilce classına bağlanmıştır!

Aşağıda kodu genişleteceğiz. Aşağıdaki kodda komposizyon + kalıtım + override ve polimorfizm vardır. Burada önceden diğerleri biliniyor varsayılıp polimorfizm ve onla ilgili konulara değineceğiz.
*********************************************************

//BASE CLAsS
class yer
{
    public yer()
    {
        System.out.println("Burası  Yer Classı");
    }
    public void goster(){
        System.out.println("**yer classındayım şu anda");
    }
}

//İLÇE CLASSI
class ilce extends yer
{
    public ilce()
    {
        System.out.println("İlçe Bir Yerdir");
    }
    @Override
     public void goster(){
        System.out.println("**ilçe classındayım şu anda");
    }
}

//İL CLASSI
class il extends yer
{
    public il()
    {
        System.out.println("İl Bir Yerdir");
    }
    @Override
     public final void  goster(){
        System.out.println("**il classındayım şu anda");
    }

}
//BÜYÜKŞEHİR
class buyuksehir extends il
{

    public buyuksehir()
    {
        System.out.println("Bir İlde Büyükşehir Var");
        obj_il.goster();
    }

    il obj_il=new il();
}

//NORMAL İL
class normalİl extends il
{


    public normalİl()
    {
        System.out.println("Bu İlde Normal Belediye Var");


        obj_il.goster();
    }
    il obj_il=new il();
}

//KASABA CLASSI
class kasaba extends yer
{
    public kasaba()
    {
        System.out.println("Kasaba Bir Yerdir");
    }
    @Override
    public void goster(){
        System.out.println("**kasabaya geldim");
    }
}

//KÖY CLASSII

class koy extends yer
{
    public koy()
    {
        System.out.println("Köy Bir Yerdir");
    }
    @Override
     public final void goster(){
        System.out.println("**köy classındayım şu anda");
    }

}
//Köyden BELEDİYE CLASSI
class belediye extends koy
{
    public belediye()
    {
        System.out.println("Köydeki bir belediye...");

        koy obj_koy=new koy();
        obj_koy.goster();

    }

}
//Köyden MUHTARLIK
class muhtarlik extends koy
{
    public muhtarlik()
    {
        System.out.println("Köydeki Bir muhtar");

        koy obj_koy=new koy();
        obj_koy.goster();
    }

}

//BÖLGE CLASSI
class bolge extends yer
{
    public bolge()
    {
        System.out.println("Bölge Oldum...");
    }
    public bolge(String s)
    {
        System.out.println("Bu Bölge" +s +"Bölgesidir");
       
    }
    public void goster(){
        System.out.println("**Bölge classındayım şu anda");
    }
       muhtarlik m=new muhtarlik();
       belediye b=new belediye();
       buyuksehir bs=new buyuksehir();
       normalİl ni=new normalİl();
    //Komposizyon kullandık yukarıda.

}

public class ulke  {

   public ulke()
   {
       System.out.println("Burası Türkiye :)");
   }
   
    static void cagir(yer y)
     {
         y.goster();
     }
   
   
   
       public static void main(String[] args) {
         ulke b=new ulke();   
         yer y1= new yer();
         kasaba k1= new kasaba();
         koy koy1= new koy();
         il i1= new il();
         ilce ilce1= new ilce();
         bolge karadeniz=new bolge(" Karadeniz ");
         cagir(y1);//upcasting yok
         cagir(k1);//Upcast var
         cagir(koy1);//Upcast var
         cagir(i1);//Upcast var
         cagir(ilce1);//Upcast var
               
         /*cagir metodu bizden yer tipinde parametre bekliyor; ama biz ona yerden türeyen
         diğer değişkenlerimizi de gönderebiliyoruz
         Java bunu anlıyor, değişkene bakıyor ve heap bölgesinde nereye bağlanılmışsa oradan hareketle
         bağlanan classın ilgili metodunu çağırıyor.*/
                }
}


 Polimorfizm sayesinde biz sadece ilgili değişkenimizi  hangi metodu çağırmak istiyorsak heap bölgesinde ona bağladık ve gerisini Java halletti. Diğer türlü olsaydı, bilmeseydik polimorfizmi nasıl hallederdik?
Klasik  yöntemlerle gelen parametreye bakıp if else'e  sokarak istediğimiz metoda gönderirdik.Tek satır kod yerine belkide onlarca satır kod yazacaktık.Ki düşen performans da kod hamballığının dışında işin cabası :/

   Kolay Gelsin.

23.02.2010

Eclipse ~ MSSQL Connection with Java

  Pek kullanılmayan bir durum olsa da Windows 7 RC 7100 OS'den yapmaya çalıştığım connection için baya  kez başarısız sonucunu gördükten sonra mutlu sona ulaşmak kolay olmadı diyebilirim.

 Öncelikle kullandığım Eclipse Galileo IDE'sinden bu işi yapabilmek için driver'ları indirmek gereklidir.
Buradan indirebilirsiniz driverları.{Hemen klasik yöntemlerle inmiyor.Çıkan html sayfasında kabul et dedikten sonra yönlendirme yapılıp dosya upload ediliyor.}

 Dosya indirildikten sonra aut klasörü içerisindeki x86 içerisnde sqljdbc_auth.dll dosyasını windows\system32 içine gönderiyoruz.

 sqljdbc.jar dosyası desktopta dursun driver gösterirken yerini göstereceğiz.{JRE 1.6 ve üstü için, bunu desteklemeyecektir, sqljdbc4.jar'ın yerini göstereceğiz.}

Şimdi dll'i \system32'nin içine gönderdik ve .jar dosyamız hazır ise açalım Eclipse Galileo'yu oradan Data Source Explorer altındaki Database Connections'a sağ click ile New diyoruz ve SQL Server seçiyoruz ve gelen yerde driver göstermemiz gereklidir.

 Bu aşamada Driversın yanında New Driver Definition simgesi var ona clickledikten sonra karşımıza pencere gelecektir.İlk tabta Available Driver templates var oradan Microsoft SQL Server 2005 JDBC Driverını seçtik, 2.taba geçtik bu Jar List tabında Add Jar/Zip ile desktoptaki sqljdbc.jar'ın yolunu gösteriyoruz.




Kritik nokta: Eğer JRE sürümü 1.6 ve üstü ise sqljdbc.jar yerine indirdiğimiz diğer sqljdbc4.jar olmalı bunu gösteriyoruz diğerinde hata vermektedir.{Denedim, sonra anladım:/}

Bir şekilde bu kısmı hallettikten sonra Test Connection kısmını gördük hemen sevinmeyelim çok fazla sayıda ping failed yazısı görebilirsiniz şaşırmayın derim!, sonuçta birbirlerine destek vermeyen Database ile özgür bir yazılımdan Eclipse IDE'si ile Windows platformundan bağlantı yapmaya çalışıyoruz, normal Visual Studio'dan yapılan database connectionu gibi kabul edersiniz ki kolay değil!

Integrated Authentication'u seçip Test Connection deyip altı üstü ping succeed yazısı görmeye çalışacağız şimdi, aşağıdaki kriterleri sağladıktan sonra.


Öncelikle  yapılması gerekli kritik adımları aşağıda yazayım, tüm bunları yaptıktan sonra başarılı bir şekilde bağlanacağız.

-->SQL Server Configuration Manager'dan -> Sql Server 2005 Network Configuration oradan TCP/IP'nin

statusu Enable olması lazım, değilse sağ click ile enable yapalım.

-->Firewall'ları kapatalım, firewallar bağlantıyı engelleyebilir.!

-->Test connection ekranında bağlanmak istediği ayarları yaparken, host kısmında localhost yerine 

localhost'un ipsini yazın.

--> Port numarası default olarak Mssql için 1433'tür. Bu port aktif mi değil mi, konsoldan netstat -an ile 

bakın, kullandığız OS'e göre mi farklılık gösteriyor yoksa ben W7 RC kullanıyorum bunda mı birşey var, o 

kadarını denemedim; ama şunu diyebilirim port noyu 5356 yapın.

-->Sanırım bu kısmı W7 ile alakalı, SQL Server SP 3 yüklemeniz gerekmektedir.!

 Tüm bu kriterlere rağmen yine de başarılı connection yapamayan arkadaşlar, OS, IDE version,Sql version ve hata mesajı ile e-posta gönderebilirse diğer kriterlere de birlikte bakarız.


>>Kısa Bilgi: Konsoldan netstat - an ile TCP-UDP ile yapılan bağlantılar ve bu bağlantıların port numaraları ile bağlantının durumunu görebilirsiniz.

Kolay Gelsin.

18.02.2010

Java'da Garbage Collector ve finalize() metodu

    C ve C++ dillerinde kodu yazan kişi, ihtiyaçlar durumunda bellekten yerini alır ve kodun ilerleyen bölümlerinde gereksiz değişkenlere ihtiyaç kalmayınca; artık buranın boşaltılması gerekmektedir ve bu değişkenlerin bellekte bulunması sağlıklı bir işlem değildir{hele ki gereksiz değişkenler için ayrılan bellek alanı büyük ve bilgisayarın RAM'i azsa:/}. Dinamik bellek yönetimini yapmak ve belleği daha sağlıklı kullanma işi kodu yazan programcı için takdir edersiniz ki ayrıca bir yüktür, sağolsun Java bu işi ben hallederim demiş olup bizleri bu yükten kurtarmıştır.

 Uygulamada kullanılmayan objelerin Garbage Collector tarafından hafızadan silinmesi büyük kolaylık sağlar, yazılan kodlardaki temel sorunların başında bu temizlik işleminin düzgün yapılmamasını dikkate alırsak kolaylığın yanında kodumuzu daha sağlıklı yazma imkanı da verir.

 Şunu belirtmekte fayda var, yazdığımız uygulamada gereksiz nesnelerin sayısı fazla değilse Garbage Collector çalışmaz, çöp toplayıcının mimarisine göre silinme işlemi değişiklik gösterebilir. Belleğin boyutuna bakar, gereksiz nesnelerin boyutuna bakar mimarisi gereği silinme işlemi gerekli ise hiçbir tetiklemeye gerek kalmadan temizliğe başlar.Eğer biz gereksiz nesnelerin silinmesi konusunda kararlıysak bunu manuel olarak tetikleyebiliriz. System.gc() ile bu tetikleme işlemi gerçekleştirilebilir.System sınıfının statik metodu olan gc() metodu ile çöp toplayıcısı gereksiz nesneleri bulur ve siler. Çöp toplayıcı değişkene bağlı olmayan  nesneleri siler.
   
public class GC {

 public static void main(String args[]) {
  İnsan i = new İnsan(4);
  new İnsan(2);
  System.gc() ;//Garbage Collector çağırıldı..
 }
}
 
  Bu durumda tahmin ettiğiniz gibi i değişkenine bağlı 4 
parametresini gönderdiğimiz İnsan tipindeki nesne silinmezken, diğeri
silinecektir..Kısacası Garbage Collectoru tetiklerken dikkatli olmalıyız.
Eğer değişkene bağlı ise nesnelerimiz sorun yoktur,Çöp toplayıcısı bunu
silmeyeceğini garanti eder; ama değişkene bağlamadıysak sıkıntılar
yaşayabiliriz.
 
  Çöp toplayıcısı gereksiz nesneleri silmeden önce finalize() 
metoduna gider, orada varsa yapılması gerekenler onları da yapar
sonra silme işlemini gerçekleştirir.

 Mesela, uygulama içerisinde C'de de olan malloc() fonksiyonu ile
yerimizi aldık bu durumda bu yerin geri verilmesini 
Garbage Collector yapmaz; çünkü Garbage Collectorun silebildiği
gereksiz nesneler new ile oluşturulan nesnelerdir.

 Nasıl silebiliriz o zaman derseniz, Garbage Collector silmeyi 
yapmadan hemen önce finalize() metodunu çağırıyor
işte bu metodun içinde free() fonksiyonunu kullanırsak
aldığımız alanı geri verip boş duruma getirebiliriz.


Kısa Bilgi: Bilgisayarınızda sistem güncelleştirmesi veya antivirus yüklemesi/kaldıması dışında tekrar başlat demesi durumunda, bu restart işlemine gerek yoktur.
Bunun yerine muhteşem üçlüyü kullanarak Ctrl + alt + delete -> Görev yöneticisi->proceses->explorer.exe'yi kapatıp, File -> new task ile explorer.exe yazmanız yeterlidir.

6.02.2010

JVM, JRE, JDK Nedir ?

        Java, sanal makinede çalışan bir dildir. Platform bağımsız olayı da nasıl oluyor acaba? Java'nın çalışma mantığında gizli diyebiliriz:)

  Programcı Java kodunu yazdığı vakit derleyici devreye girer bu Java derleyicisi byte kod denen makinenin anlayabileceği makine koduna çevirir. Biz yazdığımız kodu byte koda yani makinenin anlayabileceği koda çevirebiliyorsak artık her makine anlar bu kodu, çünkü bu her makinenin algılayabileceği machine code'tur{Tost makinesinde bile çalışır:)} Bu byte kod Java Virtual Machine tarafından step by step işletilir.
Burada JVM'nin amacı anladığınız gibi Donanım bağımsız kodu yorumlamayı ve çalıştırmasını sağlamaktır.

   Normalde çalışma mantığı nasıldır?
Öncelikle şunu belirtmek gerek, Tüm dillerde yazdığımız kodu yorumlayan gerçek mikroişlemcilerdir{Amd, Intel, Sun Sparc bla.}. Mikroişlemcinin mantığı ise belirli komutları işler. Tüm kodlar çalışabilmek için öncelikle bu komut kümelerine dönüştürülmek zorundadır.
JVM'de virtual bir işlemci gibi davranıp bizim byte kodumuzu yani makinenin anlayabileceği machine kodu step by step işler.
JVM'nin ne işe yaradığını biraz öğrendikten sonra, JRE'yi şöyle açıklayabiliriz:
Java çalıştırma ortamıdır nam-ı diğer Java Runtime Enviroment.
JRE'nin içinde JVM ve kütüphaneler bulunmaktadır.

  Yavaş yavaş compile etmek için birşeyler daha yüklememiz gerek, o da ne diyebilrsiniz. Şimdiye kadar olanlar sadece çalıştırmak içindi; ama biz kod yazmak birşeyler yapmak istiyorsak derleyiciye ihtiyacımız vardır.

 Java SDK'larını{Software development Kit}

-JDK Java Development Kit Tipleri-
J2ME:Mobil uygulamalar geliştirmek için tasarlanmıştır ve kısıtlıdır.
J2SE:Standart uygulamalar geliştirmek içindir.
J2EE:Kısacası hemen hemen hepsini kapsıyor, en üst düzey diyebiliriz:)recommended
buradanyükleyebiliriz.
Yüklemede sorun yaşayanlar için buradan destek alabilirler.

  Şimdi istediğiniz IDE{Integrated Development Enviroments}'yi kurup kodunuzu yazabilirsiniz.Yeri gelmişken belirtmekte fayda var, kodu çalıştırmak için IDE olmazsa olmaz değildir. Sadece kod yazarken işimizi kolaylaştırır.
Yoksa notepad'te yazdığımız kodu ornek.java diye kaydedip konsoldan çalıştırabiliriz.
IDE işimizi kolaylaştırır, imdadımıza yetişir avantajları saymakla bitmez.

   C#' ta kod yazarken Visual Studio IDE'si var ki; popularitesinin artmasında geniş bir kitle tarafından kullanımasındaki mühim etkenlerden birisidir bence.

 Java'da durum biraz farklı çok fazla IDE bulunmaktadır yaygın olarak kullanılanlar Eclipse, Netbeans, jdeveloper, intellij.

  IDE'lerden biraz daha bahsetmek gerekirse makinenizin özellikleri güzelse Netbeans kullanmak avantajlıdır kullanımı kolay ve görsel programlama basittir, dezavantajı sistemde baya yer kullanma gibi bir ihtiyaç hissediyor kendisinde:) O yüzden makineniz pek iyi özelliklere sahip değilse tercih sebebi değildir.Ayrıca plug-in desteği Eclipse'e oranla iyi değildir.
Eclipse'e bakarsak sistem kaynaklarını fazla yormuyor, plug-in konusunda iyi bu demek değil ki default Eclipse'te plug-in var, indirdikten sonra Visual editor eklentisini indirip bu eklenti ile görsel ayar çekebilirsiniz(Başka eklentilerde var) bu arada arkasına IBM'i almıştır Eclipse:)

 Kısa Bilgi:
 Deep Freeze kaldırmak için tuş kombinasyonu : CTRL+ALT+SHIFT+F6.

3.02.2010

CETURK Java Kariyer Günü ;)






CETURK JAVA ve Kariyer Günü

CETURK olarak Çankaya Üniversitesi Uygulamalı Matematik Bilgisayar Bilimleri Topluluğu ile birlikte "JAVA ve Kariyer Günü" etkinliği düzenliyoruz. Etkinlik konusu dahilinde JAVA dünyasındaki kariyer olanaklarından bahsedilecek ve etkinlik sonundaki panelimiz ile bilgi alışverişi gerçekleştirilecektir.Etkinliğe katılım ücretsizdir.


Konuşmacılar ve Seminer Konuları:
Kadir Teke - Mehmet Gursul : İş İlanlarında Java

Kenan Sevindik : Java, Kariyer ve Gelecek


Mert Çalışkan : Fikrim Açık, Kodum Açık
Ümit Vardar : JavaFX
Adres:


Çankaya Üniversitesi - Mavi Salon
Tarih: 19 Şubat 2010 - Cuma
Saat: 12:00 - 17:00


Kayıt işlemi için bu bağlantıyı kullanabilirsiniz.

2.02.2010

Java ~ ~ C# Comparision

Object Oriented programlama dillerinden Java veya C#'ı iyi derecede biliyor ve benim gibi projeleri farklı dillerde yazma gerekliliğiniz oluyorsa takıldığınız yerlerde size yol gösterebilecek, güzel bir şekilde hazırlanmış bir dokumana buradan ulaşabilirsiniz.

Günün sevdiğim lafını da paylaşayım bu arada:)

Yazılımcı; güzel bir kahveyi projeye dönüştürebilen bir insandır:)

30.01.2010

Asp.Net ile Servera dosya upload edilmesi

Bu upload işlemini yapmadan önce, upload edeceğimiz klasörün permission'larından Asp.Net Users'larına w{write}  izni vermemiz gereklidir, yoksa durmadan yazmak istediğiniz klasöre izniniz yok hatası alırız.
Permissionlarda sorun yoksa ufak bir kodlama ile upload işlemini gerçekleştirebiliriz.

Bir tane fileupload kontrolü  ve upload butonu işimizi görecektir.

  protected void Button1_Click(object sender, EventArgs e)
    {
        if (FileUpload2.HasFile)
        {
            FileUpload2.SaveAs(Server.MapPath("Abstract Formats") + "\\" + FileUpload2.FileName);
        }
        else
        {
            Label1.Text = "Select file to upload yet made!";
        }
    } 

Kolay Gelsin.

14.01.2010

Asp.Net'te İçeriği Mail ile Gönderme

Web sitemizde herhangi bir form ya da yorum satırına girilen içeriğin istediğimiz
mail adresimize gelerek haberdar olmak istiyoruz.Aşağıdaki C# kodlu fonksiyon bu iş için biçilmiş kaftan.

public void MailGonder()
{
MailMessage _mail = new MailMessage(); // MailMessage nesnemizi oluşturuyoruz.
_mail.From = new MailAddress("yorumcu@yahoo.com"); // Burada kimden geldiğinin E-posta adresi
_mail.To.Add("destination@yahoo.com"); // hangi mail adresine gidecegi yazılmalıdır.Add metodu içerisine MailAddress almaktadır. MailAddress te tanımlayarak buraya giriş yapabilirsiniz.
_mail.To.Add("destination@yahoo.com");//Destination mail birden fazla olbilir.
_mail.Subject = TextBox3.Text; // Mail konusu..Bu textbox 'ı Subject için koymuştum.
_mail.Priority = MailPriority.Normal; // Ek bir özelliktir mail öncelik değeri belirtilmektedir.
_mail.Body = "First Name:" + TextBox1.Text + "| Last Name:" + TextBox2.Text + "| Title:" + TextBox3.Text + "| Organization:" + TextBox4.Text + "| Phone #" + TextBox5.Text + "| E_mail:" + TextBox6.Text + "| Adress:" + TextBox7.Text + "| City:" + TextBox8.Text + "| State:" + TextBox9.Text + "| ZIP Code:" + TextBox10.Text + "| Country:" + TextBox11.Text; // Mail içeriği buraya yazılmaktadır.

//Form uygulaması olduğu için içeriği concat edip gönderiyorum.
SmtpClient _client = new SmtpClient(); // smtp sunucusuna bağlanmak için kullanacağımız nesnemizi oluşturuyoruz.
_client.Credentials = new System.Net.NetworkCredential("mailadres", "pass"); // Mail adresi ve şifremizi gösteriyoruz.
_client.Host = "smtp.gmail.com"; // gmail smtp sunucu ismi
_client.Timeout = 5000000; // timeout :)
_client.Port = 587; // kullanılacak olan port burada hotmailın kullandığı porttur.
_client.EnableSsl = true;//En kritikk yer:)Bununla uğraştım baya.ssl 'i aktifleştirmeyince olmuyor.
//_client.SendCompleted += new SendCompletedEventHandler(_client.SendCompleted); // Gönderildikten sonra tetiklenecek.Tetiklenme durumunda mailın gönderilmiş yada gönderilmemiş olduğunu buradan öğrenilebilinir.

string userState = "Mail Gönderiliyor";
_client.Send(_mail); //Gönderme olayı
Response.Write("Your entry has been successfully!");
}


Gmail adresinizi kullanlırsanız daha garanti bir çözüm, diğerlerinde sıkıntı yaşadım.
 

1.01.2010

2010

Başkalarının değil kendi istediğiniz hayatı yaşayacağınız,
hayallerinizi asla bırakmayacağınız,
mutlu edebileceğinizi bilerek hiç yılmadan amacınıza ve sevdiklerinize sarılacağınız,
engellerin hedeflerinizi aslında ne kadar istediğinizi test etmek için karşınıza çıkacağını aklınızdan çıkarmayacağı,
arkadaştan ziyade Dost edindiğiniz,
mevcuttaki Dostlarınızın da neye karşılık olursa olsun giderek büyüdüğü,
bir yol seçtiğiniz veya yol açtığınız,
zirveye çıkmaktan ziyade; orada da kalacağınız Sağlıklı bir yıl olsun :)