22 Aralık 2015 Salı

Dinamik web sayfaları mı dediniz? JSP, JSF, Servlet ve Bean' e bir bakın !

Java EE ve web geliştiriciler için önemli, birbirine yakın ve  iç içe olan şu teknolojiler ;  JSF, JSP, Servlet  birbirleri ile çok karıştırılır. Katkı verdiğim projede bunun gibi teknolojileri kullanıyoruz. Bu yazımda bu teknolojiler nelerdir? Farkları nelerdir ? Nasıl kullanılırlar ? Bunlardan bahsetmek istedim.

Java Server Pages (JSP)

Bir java uygulama sunucusu üzerinde çalışan, HTML, CSS Javascript çıktısı üretebilen java gösterim teknolojisidir. JSP, Html içine özel taglar "<%.....%> kullanılarak, java kodları yazılması ile elde edilir. Web sunucusunda değil, uygulama  sunucusunda çalışır.

Yazılış şekline basit örnek  şu verilebilir :

<hmtl>
<head>
<title> İlk JSP </title>
<body>
<%
String name="Aylin";

System.out.println ("Merhaba" +name+ "Giriş yaptığın saat :"+ LocalTime.now(); +"olarak kaydedilmiştir");
%>
</body>
</html>

JSP platformdan bağımsızdır. Java Classları ile çalışabilmektedir. Apache Tomcat gibi uygulama sunucularında çalışır.

 Servlet

Sunucu üzerinde çalışan dinamik içerik üreten web bileşenidir. HttpServlet buna örnektir. JSP kodu ilk çağrılınca, Tomcat gibi sunucular başlatıldığında  JSP kodunun servlet tarafından classları oluşturulur. Sunucuda servletin bir instance i (örneği ) oluşturulur ve sunucunun yaşam süresi boyunca bekler, gelen isteklere yanıt verir.

Bir JSP nin yaşam döngüsünde ilk dört adım JSP 'nin Servlet ' e dönüşme adımlarıdır :

  • Sayfa parse edilir,  java sınıfına dönüştürülür.
  • Compile edilir.
  • Hafızaya yüklenir.
  • instance yaratılır.
  • jsplnit() metotu çağrılır.
  • _jspService() metotu çağrılır
  • jspDestroy() metotu çağrılır ve son bulur.
Java Server Faces (JSF)

JSF MVC tabanlı bir teknolojidir. Kontrol,  modelleme ve gösterimi ayrı ayrı yapabilmek için geliştirilmiştir. İki tip MVC vardır ; request tabanlı ve olay(event) tabanlı MVC.  Request tabanlı olan apache strutsdur . Olay tabanlı olan ise JSF dir. Kendi içinde hazır kütüphaneleri vardır. Bazı bileşenler daha önceden yapılmış hazır paketler halinde sunulur.

Sonuç olarak diyelim ki dataTable kullanacaksınız JSF ' nin hazır componentleri ile yapabileceğiniz gibi,  JSP ile HTML ve CSS kodları yazarak da gerçekleştirebilirsiniz. JSP ve JSF nin basit olarak farkı budur diyebiliriz.

Java Bean

Bean sınıfları çok katmanlı uygulamalarda katmanlar arası iletişim , veri taşımak için kullanılır. Veritabanı işlemleri yaptığınız bir uygulamada sınıflar birbirlerinin metotlarını çağırıp kullanabilir. Bu çağrıları da parametrelerle gerçekleştirir. Bir çok özellik barındıran bir bileşen düşünün bunların her birini parametre olarak tek tek göndermek yerine bileşenlerin değerlerini bean sınıfa yazıp geri göndermek daha mantıklıdır. Bean sınıf, parametre almayan varsayılan yapıcı metotları içermeli, tüm değişkenleri private tanımlanmalı, get set metotları olmalı, java.io.Serializable arayüzünü implement etmeli !

Örnek bir bean sınıf :

public class StudentsBean implements java.io.Serializable
{
   private String firstName = null;
   private String lastName = null;
   private int age = 0;

   public StudentsBean() {
   }
   public String getFirstName(){
      return firstName;
   }
   public String getLastName(){
      return lastName;
   }
   public int getAge(){
      return age;
   }
   public void setFirstName(String firstName){
      this.firstName = firstName;
   }
   public void setLastName(String lastName){
      this.lastName = lastName;
   }
   public void setAge(Integer age){
      this.age = age;
   }
}



10 Aralık 2015 Perşembe

Big Data Hakkında

Big data diskte çok yer kaplayan, klasik yöntemlerle işlenemeyen veri anlamına gelir. İnternetin gelişmesi ve sosyal medya devrimi ile bilgi yoğunluğu artmış ve en küçük bilgi bile önemli hale gelmiştir.İnternette her bir tıklamadan tutun da finansal, istatiksel, medikal veriler hepsi birleşerek dev veriyi oluşturuyor.

Facebook, Twitter her gün yaklaşık 10 TB veri saklıyor. Peki bu büyük veriler nerede saklanıyor ? Bu büyük verileri klasik yöntemlerle saklamak için  milyon dolarlık donanım üzerinde çalışan yüzbinlerce dolarlık veritabanı sistemine sahip olunması gerektiği söyleniyor. Bu sisteme sahip olunsa bile birbiri ile ilişkili olan kelimelerin analizi yapılmak istenirse bunu SQL sorguları ile yapabilmek pek mümkün değilidir. Sorgu işlemi çok uzun süreceği için elde edilen sonuç güncelliğini yitirecektir.Büyük veri işlemek için büyük veri çözümlerine ihtiyaç vardır.Bu noktada NoSQL ortaya çıkmıştır.

 NoSQL,  SQL değil anlamına gelse de aslında sadece SQL değil demektir. Hepimizin kullandığı ilişkisel veritanlarında mantık önce tabloları oluşturmak, her tabloya ait sütun bilgileri girmek , sonrasında bilgileri satır satır girmektir. Fakat burada şu sıkıntı çıkmaktadır; tanımı olmayan alana bilgi kaydetmek. Bu sıkıntıdan kurtulmak için tablo yeniden ele alınıp yeni sütunlar eklenir.Tüm tabloları etkileyen durumlar ortaya çıkacağı gibi tüm sistemi tekrardan ele almak çok maliyetlidir. NoSQL ise tablo ve sütun kavramı yoktur. Döküman tabanlı sistemdir. Yeni bir alana ihtiyaç olduğunda kaydı direk eklemek yeterlidir. Bu sistem bizim yerimize alanı oluşturup değerini kaydeder. Maaliyetin az olmasının sebebi de JSON ve XML formatına benzer yapıda verinin saklanmasıdır. NoSQL SQL den daha iyidir gibi bir kavram söz konusu değildir. İkisininde yerinde, ihtiyaca göre kullanılması gerekmektedir.

 Google klasik yöntemleri kullanmamış  ihtiyacı olan teknolojiyi kendi geliştirmiştir. Milyonlarca veriyi Google File System (GFS) üzerinde tutar, veri tabanı olarak Big Table kullanır, dev veriyi işlemek için de MapReduce kullanır. GFS geniş ölçekli ,  dağıtık loglanabilir,  kontrol altında tutulabilen bir dosya sistemidir. MapReduce dağıtık mimari sistemidir. Map aşamasında veriler ana düğümden ufak parçalara ayrılarak işçi düğümlere dağıtılır. İşci düğümler işi tamamladıkça ana düğüme iletir. Reduce aşamasında da tamamlanan işler birleştirilerek istenilen analiz sonucu elde edilir. BigTable ise küçük tabletlere bölünmüş büyük mantıksal bir tablodur. Tek bir bilgisayarda işlenecek veri çok sayıda ufak ve daha ucuz bilgisayarlar tarafından işlenebilmektedir. Satır seviyesinde işlemler gerçekleştirilir. İlişkisel veri tabanlarında olduğu gibi tüm tablolara erişip join işlemi gibi maliyetli bir işlem yerine satır index mantığı ile disk erişimi azaltılıp bir erişimde site ile ilgili tüm bilgilere ulaşılabilir.

Facebook, Twitter, Linkedin gibi firmalar dev veri için geliştirdikleri projeleri açık kaynak olarak paylaşmaktadırlar. Bunlar Casandra,  Hadoop,  MongoDB,  Redis gibi projelerdir.

Ben bunlardan MongoDB ile ilgili bilgilerimi aktardığım yazılarımla, sizlerle olacağım .

8 Aralık 2015 Salı

Git Kurtarıcı Komutlar

Git bilindiği üzere sürüm kontrol sistemidir(SKS). Git dosyalarınızda, projenizde değişiklikleri kaydetmek, karşılaştırma yapmak ve istediğiniz sürüme geri dönebilmek için önemli bir araçtır.Git hakkında daha fazla bilgi edinmek için  bakınız :   Kaynak 

Bir sorun olduğunda en son kimin değişiklik yaptığını, sorunun nereden kaynaklandığını görebileceğiniz , silinen değişiklikleri kurtarmak için tabiri caizse hayat kurtaran bir çok önemli  git komutlarını  bilmek gerekir.

Git temel komutları şunlardır :


Ben sıklıkla ihtiyaç duyduğum,  önemli olan  birkaç komut hakkında bilgi vereceğim. Hangi durumlarda ihtiyaç duyar ? Nasıl çözüme kavuşuruz ? 


 1.  Öncelikle birçok kişinin birlikte yürüttüğü bir proje üzerinde çalışıyorsanız dikkat edilmesi gereken durumlar vardır. Projeyi çalıştırdınız,  hata veya bir eksik fark ettiniz bunu düzeltmek isteyebilirsiniz. Peki ya biri bunu düzelttiyse ? Yapılan bir şeyi tekrar yapmak gereksizdir.Daha da önemlisi siz farklı yöntemle düzeltirsiniz aynı sayfa üzerinde çalışacağınız için çakışma olacak ve içinden çıkılmaz bir hal alacaktır. Merge olan bir projeden kolaylıkla geri alınamayan bir durumla karşılaşmış olacaksınız .

Bunun için ilk tavsiyem projenizin bulunduğu dizindeyken  sizden önce yapılan değişiklikleri çekmek ve kontrol etmekte fayda var . 

Bunu sağlayan komut : 
  • git pull origin master 

master projenizin merge olmuş içeriklerinin bulunduğu ana dizindir. Bu dizinden değişikleri bu komutla yerelimize çekiyoruz.
  • git fetch origin master  

komutu ile localimdeki değişikliklerle çektiğim değişiklikleri birleştir diyoruz.     

2. Bir branch açtınız ve üzerinde çalışmanızı yürüttüğünüz esnada kullanmanız gereken bir şeye ihtiyaç duydunuz ve bunu sizin çalışmanız esnasında başka bir arkadaşınız halletmiş ve merge olmuşsa bunu çekmek istiyorsunuz, fakat işiniz bitmedi push etmediğiniz içinde pull edip kullanamıyorsunuz bu noktada imdadınıza stash yetişiyor. Stash değişiklikleri geçici olarak tutan farklı bir depolama alanıdır. 
  • git stash 
deyip bu değişikllikleri stash e atarsak, master branca geçip pull ettikten sonra tekrar kendi brancınıza dönüp;
  •  git stash pop 
diyerek stash e attığınz çalışmanızı alıp bahsettiğimiz senaryoyu gerçekleştirmiş olacaksınız. Stash de başka hangi yedekler var görmek için;
  •  git stash list  
işe yarayacaktır.
  • git stash drop
 ile de stashi temizleyebilirsiniz. Stash de bir çok kayıt var siz içinden birini çekmek istiyorsanız ;
  • git stash pop stash@{1} 
diyerek listeden istediğiniz sırada bulunan kaydı çekebilirsiniz.    
                             
3. Projenizi herhangi bir brancha resetlemek de ihtiyaç duyulan durumlardan birisidir. Bunun için de;
  • git reset--hard origin/master,  origin/feature/12
komutu çalıştırılır.       
                                    
4. Çalıştığınız branch üzerinde push ettikten sonra başka değişiklikler yaptınız fakat her biri için her defasında farklı commit mesajları yazmak iyi fikir değildir. Çalışmanızı merge olmadan önce kontrol eden yetkililer birden fazla commit görmek pek istemezler bunun için;             
  •  git commit --amend 
komutu sayesinde önceki commit ile push etmeyi sağlayabiliriz.        
                                
Branchınızda her yaptığınız değişiklik için push ederken birden fazla commit kullanmış olabilirsiniz. Bunu sonradan düzeltmek isterseniz de şu komut;
  •  git rebase -i HEAD~3 
kullanılır. Bu komut ile 3 tane birleştirmek istediğimi ifade ediyorum.                                                                    
5. Bir diğer önemli konu da Rebase işlemidir. Aynı dosya üzerinde çalışan kişilerin sıklıkla karşılaştığı can sıkıcı uğraştırıcı bir durumdur. Siz çalışmanızı yürütürken diğer arkadaşınızın tamamladığı kısım merge olmuşsa rebase yapmanız gerekir. Rebase için takip etmeniz gereken önemli adımlar şunlardır:
      
1.Master branchına geçiyoruz:
    • git checkout master
2.Localimizdeki master dizinini güncelliyoruz:
    • git pull origin master
    • git fetch origin master
3.Kendi branchımıza geçiyoruz:

    • git checkout feature/test
4.Master dizinine göre rebase başlat diyoruz:
    • git rebase - -interactive origin master
5.Şu komutla duruma bakarak çakışan dosyaları kırmızı olarak görüyoruz :
    •  git status 
6.Sonra bu dosyalara geçip çakışan kısımları düzeltip kalan  komutlarla devam ediyoruz.  Değiştirdiğiniz dosyaların hepsini push etmek için ekliyoruz:
    •  git add .
7. Dikkat edelim !  mesaj yazmıyoruz aynı commiti kullanması için :
    • git commit 
8.Continue  devam için,  abort  iptal için kullanıyoruz:
    • git rebase - - continue,  git rebase - -abort

9.Push ederek tamamlıyoruz.
    • git push -f origin feature/test