3 Aralık 2015 Perşembe

MongoDB Hakkında

Merhabalar, uzun zamandır mongoDB hakkında yazmak istiyordum sonunda fırsat bulabildim. 

Öncelikle mongoDB hakkında kısa bir ön bilgi vermem gerekirse; 


      *  Doküman tabanlıdır.
      *  C++ ile geliştirilmiştir.
      *  NoSQL veritabanıdır.
      *  Özellikle hız gerektiren ve fazlaca veri yoğunluğunun olduğu uygulamalarda kullanılmaktadır.
      *  Veriler JSON ya da XML formatında saklanmaktadır.
      *  Veriler hiyerarşik olarak tutulmaktadır.



Peki NoSQL nedir?
NOSQL ile tabloları birbiri ile ilişkilendirmeye gerek duymadan tanımlamaları yapıyoruz. Yani "ilişkisel olmayan" verileri depolayabileceğiniz veritabanı sistemleridir.  NoSQL'in açılımı ise Not-only-SQL'dir. Yani sadece SQL kullanılmayan anlamındadır. NoSQL tabanlı veritabanlarının genel özellikleri olarak:
  •  Sorgulama arayüzleri değişkenlik gösteriyor. (JSON, REST vb.. şeklinde farklı      API'lerle ) Yani SQL sorguları ile çalışmıyorlar.
  •  Veri tipleri önceden belirlenmemiştir
  •  Dinamik veri şeması kullanıyor
  •  Yatay ölçeklendirmeye göre tasarlanmışlardır.
  •  Veriyi disk ya da sadece hafızada taşıyabilirler.

diyebiliriz.


MongoDB kullanırken  benim en sevdiğim özellikleri ise, hangi tablolar arasında hangi sütunla ilişki kurulacak vs. şeklinde düşünmeye gerek kalmıyor. Modelleri istediğiniz gibi tasarlayıp daha sonra ilişkisi olan bir modelden diğer modele bir referans vermeniz yeterli oluyor. Ayrıca sorguları çok hızlı bir şekilde çalıştırabiliyoruz.


MongoDB kurulumuna gelecek olursak:

Ben Linux-Ubuntu kullandığım için Linux-Ubuntu için olan kurulum aşamalarına değineceğim. Dilerseniz şurada tüm işletim sistemleri için kurulum aşamları güzel bir şekilde adım adım anlatılmış. Sayfada sol menüden linux, windows, mac vs işletim sistemini seçip o işletim sistemi ile ilgili kurulum sayfasına gidebiliyorsunuz.

Eğer ubuntu kullanıyorsanız ben size yormayayım ve burda adımları vereyim :)

Terminalimizi açıyoruz. Ve aşağıdaki komutları adım adım yazıyoruz.



1)


sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB10



2)

Bu adım sürümden sürüme değişiyor. Ben Ubuntu Gnome 14.04 için olanını yazıyorum            

echo "deb http://repo.mongodb.org/apt/ubuntu trusty/mongodb-org/3.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.0.list
3)
sudo apt-get update

4)
sudo apt-get install -y mongodb-org

Kurulum tamamlandıktan sonra çalıştırmak için konsoldan "mongo" yazıp çalıştırabilirsiniz. Bu komut ile mongoDB'nin komut satırına girersiniz.


Eğer mongoDB'niz otomatik çalışmıyorsa şu komutu yazmalısınız: "sudo service mongod start" Servisi kapatmak için ise tahmin edersiniz ki :) "sudo service mongod stop"


MongoDB'nin komut satırından çıkmak için ise Ctrl+c yapmalısınız. 




MongoDB Komutları


Terminalde mongo yazıp mongoDB komut satırına girdikten sonra aşağıdaki komutları kullanabiliriz.


$ show dbs komutu ile varolan veritabanlarını görüntüleriz. İlk kurduğunuzda test diye bir veritabanı olmalı.


$ use dbName komutu ile işlem yapacağınız veritabanını seçiyorsunuz.


$ db komutu ile şuan hangi veritabanı seçili ise onu görürsünüz.


$ db.createCollection('CollectionAdı")  komutu ile seçili olan veritabanına bir collection eklersiniz.

Collection'ı ilişkisel veritabanlarındaki Tablo gibi düşünebilirsiniz. 

$ show collections komutu seçili olan veritabanımızdaki tüm collectionları listeler.


$ db.CollectionAdı.insert({collectionAdı_id:"ad",yas:10,durum:"a"}) komutu ile "CollectionAdı" adındaki collection'a veri girmiş olduk. İlişkisel veritanablarındaki satır yerine document, sütun yerine field kullanılıyor.


$ db.CollectionAdı.find() komutu "CollectionAdı" Collection'ını görüntüler.


$ db.CollectionAdı.find().pretty() yukardaki komutla aynı işlevi görür ancak daha düzenli bir şekilde veriler gelir. (dökümanlar alt alta gelecek şekilde)


$ db.CollectionAdı.findOne() bu komut ise collectiondaki herhangi bir dökümanı getirir.


$ db.CollectionAdı.find({"id" : ObjectId("abcd12345")}) bu komutla ise Collection içerisindeki tek bir elemanı görüntülememizi sağlar.


$ db.collectionAdı.update({},..) komutu collectionı günceller.


$ db.collectionAdı.drop() komutu ile collectionı kaldırırırz


$ db.CollectionAdı.remove({}) collectionı kaldırmayıp içindeki tüm verileri silmek içindir.


$ db.CollectionAdı.remove({"id" : ObjectId("abcd12345")}) bu komut ise Collection içerisindeki belirli bir elemanı silmeye yarar.


$ db.source-namespace.renameCollection( "target" ) komutu ile collection adını değiştiririz.


$ db.CollectionAdı.count() komutu collection içerisindeki eleman sayısını verir. Collection içerisindeki obje ya da dökuman sayısını verir dersek daha doğru olur.


db.CollectionAdı.stats()  komutu collectionın ozelliklerini gosterir


$ db.dropDatabase() komutu ile seçmiş olduğunuz veritabanını silersiniz.


$ db.copyDatabase('dbAdı','dbAdı','cekeceginiz pcnin ipsi')  bu ise başka makinedeki bir veritabanını kendi makinenize çekmeyi sağlar.



MongoDB Export ve Import İşlemleri


MongoDB'deki bir collectionın json ya da başka bir formatta exportunu almak istiyorsanız aşağıdaki komut kullanılır. Bu komutları yazarken terminali açıp mongo komut satırına girmeden normal komut satırında yazıyoruz.


mongoexport --db veritabanıAdı --collection collectionAdı --out dosyaAdı.json


Bu komutla adını vermiş olduğunuz collectionı dosyaAdı.json dosyasına JSON formatında exportunu alıp kaydeder. Dosya home dosyasında konumlanır. İsterseniz bu komutu daha çok özelleştirebilirsiniz. Başka bir host'tan (yukarıdaki komutta default host olarak localhostu algılar) veya başka bir klasör konumu vererek exportunuzu oraya kaydedebilirsiniz.


Bir JSON formatındaki dosyanızı mongoDB'ye import etmek için yine terminalde normal komut satırından aşağıdaki komutu yazıyoruz.


mongoimport --db veritabanıAdı --collection CollectionAdı  --file  dosyaAdı.json


Bu komut ise home klasöründe dosyaAdı.json dosyasını arar. Eğer dosyanız home dışında bir klasörde ise yine onu komutta belirtmeniz gerekiyor.( ~/**/dosyaAdı.json vs.)



Son olarak mongoDB komut satırı ile uğraşmak istemeyenler için bir veritabanı yönetim aracı önerebilirim: Robomongo. Kurulumu oldukça basit. Kurduktan sonra bir kereliğine bir kaç ayar yapmanız gerekiyor. 


Aşağıya bir ekran görüntüsü bırakıyorum :)













20 Ekim 2015 Salı

Play Framework Job Kullanımı

Merhabalar,

Uygulamalarında play framework kullananlar için yararlı olacağını düşündüğüm bir konuya değinmek istedim. Job oluşturma.

Kısaca niçin job kullanırız, neden ihtiyaç duyarız ve nasıl kullanırız konularına gelecek olursak şöyle ki belirli bir zaman diliminde çalışmasını istediğiniz bir fonksiyonunuz var ya da daha gerçekçi bir örnek vermem gerekirse; günlük hava durumu verilerini bir web servisi ile çekip veritabanına kaydetmek veya bu verileri kullanarak bir sayfada grafik oluşturmak vs. istiyorsunuz. Bunun için fonksiyonu arayüzden tetiklemek (bir arayüz elemanı(buton vs.) ile fonksiyonun çalışmasını sağlamak) yerine sizin vereceğiniz bir zamanda gitsin web servisten verileri çeksin ve istediğim işlevleri yapsın diyorsanız tam da Job kullanma zamanıdır.


Peki Nasıl Kullanılır?

Play Framework içerisinde Job.java isminde bir class bulunmakta. Öncelikle fonksiyonunuzu tanımlayacağınız classı bu Job classından extends etmeniz gerekiyor.

Daha sonra Job.java içerisindeki doJob() metodunu override ediyoruz. Ve istediğiniz işlemleri bu fonksiyonun içerisinde yazabilirsiniz.

Class'ın başına da @On("0 0 18 * * ?") şöyle bir annotation vermeniz gerekiyor.

Burada @On yine play frameworkun On.java isimli bir interface'i.

@On içerisine yazdığımız parametre ise hangi zaman diliminde çalışacağını gösteriyor.

İlki-> saniye, ikincisi-> dakika, üçüncü-> saati göstermekte.

Sondakiler ise -> gün, ay, ve yılı gösteriyor.

* -> hepsi
? -> herhangi

anlamlarına gelmektedir.

Play framework'un kendi sitesinde ise şu şekilde anlatılmış -> bakınız.


Son Derece Sade ama Genel Yapı Hakkında Fikir Vermesi Açısından  İnceleyebilirsiniz :)

package jobs.havaDurumu;

import play.Play;
import play.jobs.Job;
import play.jobs.On;
import play.libs.WS;

@On("0 0 18 * * ?")
public class HavaDurumuJob extends Job {

    @Override    public void doJob() {

        /*buraya veriyi çekeceğiniz web servis url'ini yazıyorsunuz*/

        final String URL = "http://sinemakkoyun.com"; 

        String results = WS.url(URL).get().getString();

       /*verileriniz results'dadır. Bundan sonrasında results ile ne işlem yapmak isterseniz onları eklemelisiniz.*/
    
   }
}

Sevgiler.

22 Eylül 2015 Salı

Selenium ile Web Tabanlı Uygulamalarda Test Yazımı

Merhabalar,
     Çalışmaya başladığım ilk zamanlarda selenium ile uğraşmıştım, yine ofiste hazırlamış olduğum bir selenium sunumu vardı.
     Şuan selenium ile uğraşanlar var ise bu sunumun ufak da olsa yararı olacağını düşünüyorum:) O yüzden bu sunum da burada dursun dedim :)
      Sunum için---> tıklayınız

     Umarım faydalı olur. Sevgiler.

14 Ağustos 2015 Cuma

Docker İle Uygulama Sanallaştırma

Merhabalar, ofiste hazırlamış olduğum bir docker sunumu vardı. Sunumda docker genel olarak ne işe yarar, genel özellikleri ve küçük bir docker örneği anlattım. İsterseniz sunumu şuradan indirebilirsiniz. Umarım faydalı olur. Sevgiler.

3 Ağustos 2015 Pazartesi

Excel Export İşlemi (Java, Play Framework ve Javascript vs. )

Merhabalar, son zamanlarda uğraştığım bir işle ilgili yazmak istedim. İstediğim sonuca ulaşana kadar baya bir yolunu denedim o yüzden tecrübelerimi paylaşmak istedim.

Konumuz bir tabloyu excel export almak. Bu işlem için uygulamanızda kullandığınız dillere, frameworklere vs. göre çeşitli yöntemler bulunuyor. Benim değinmek istediklerim ise:

* Düz java ile excel export işlemi
* Sadece javascript kullanarak excel export işlemi
* Play Framework ve Java ile excel export işlemi

İlk önce sadece java ile excel export işlemini anlatayım:

 public static void excelExport() {
    

        List<Kullanici> kullaniciListesi = new ArrayList<>();

/*Kullanici adinda bir nesnem olsun bunun da isim, soyisim, doğum tarihi, doğum yeri gibi özellikleri olsun. Burada her bir elemanı Kullanici olan bir liste yaratıyorum.*/


        String fileName = null; //export alacağım excel dosyasının adı


       /*Liste boş değilse filename'e null dışında bir değer atıyorum ve sonuna .xls uzatısı ekliyorum. */

        if (kullaniciListesi != null) {
            fileName = "KullaniciListesi".xls";
        } 

// Excel tablom için sütun başlıkları tanımlıyorum.
        final String header = "İsim, Soyisim, Doğum Tarihi, Doğum Yeri";
        final String newline = "\n";
        final String comma = ",";


//listenin boş olmasına karşın bu kısmı try cache içerisine aldım.
 try {

         //yukarıda tanımlanan filename adında bir dosya oluşturuyorum
            File file = new File(fileName);
            FileWriter fw = new FileWriter(file);
            BufferedWriter bw = new BufferedWriter(fw);
            bw.write(header.toString());
            bw.write(newline);
        /* Aşağıda ise listemdeki her kullanıcı nesnesinin tüm özellikleri için null kontrolü yapıyorum. Bu kontrolü yapmak gerekiyor yoksa npe yiyebilirsiniz:) */
            for (Kullanici k : kullaniciListesi) {
                if (k.isim != null) {
                    bw.write(k.isim);
                } else {
                    bw.write(" ");
                }
                bw.write(comma);
                if (k.soyisim != null) {
                    bw.write(k.soyisim);
                } else {
                    bw.write(" ");
                }

               bw.write(comma);
               if (k.dgmTarihi != null) {
                   bw.write(k.dgmTarihi);
               } else {
                   bw.write(" ");
               }

               bw.write(comma);
                if (k.dgmYeri != null) {
                    bw.write(k.dgmYeri);
                } else {
                    bw.write(" ");
                }

                bw.write(newline);
            }
            bw.close();

        } catch (IOException e) {
            e.printStackTrace();
        }
    }


 Tabiki son dönemde böyle bir iş yapmak biraz gereksiz oluyor. Frameworklerin bize sağladığı nimetlerden yararlanmak gerekiyor :) Biraz bulmakta zorlanmakla beraber Play Framework'te bu iş nasıl yapılıyor bir de ona bakalım:

Öncelikle şöyle bir küçük çaplı araştırma sonucunda play 1.2'den sonra renderExcel olmadığını söylemeliyim. Yani Play framework dışında bir de play framework'un excel export için olan plugini projeye dahil etmeniz gerekiyor. Ben projemde play 1.3 kullandığım için bu plugini projeme import etmek zorunda kaldım. 

https://www.playframework.com/modules/excel şu linkten istediğiniz excel plugin versionunu indirebilirsiniz. 

Projenize bu plugini import ettikten sonra: conf/application.conf dosyasına aşağıdakileri ekliyoruz:

# The Excel module
module.Excel=${play.path}/modules/excel-1.2.3
excel.template.root=app/views


Daha sonra controller içerisine icerisine asagidaki satirlari yazıyoruz:

public static void exportAl() {
List<Kullanici> kullaniciListesi = new ArrayList<>();
String fileName = "kullanicilar.xls";
request.format = "xls";
renderArgs.put(RenderExcel.RA_ASYNC, true);
renderArgs.put(RenderExcel.RA_FILENAME, fileName);
render(kulaniciListesi, period);
}


Bunları yaptıktan sonra indireceğiniz excel sayfası için uygulamanız içerisinde bir excel dosyası yaratıyorsunuz ve dosyayı istediğiniz şekilde formatlıyorsunuz.
Sütun başlıkları, font ayarları vs yapabilirsiniz. Herhangi bir makineda export al komutu verdiğinizde sizin hazırladığınız excel formatı şeklinde indiriyor.

Hazırladığınız excel dosyasını app/views dizininde oluşturmalısınız. Çünkü .xls uzantılı dosyayı orada arıyor. Ve ismini de metodunuza verdiğiniz isim olarak yani exportAl.xls şeklinde oluşturmalısınız.

bu kadar :) 

Şimdi gelelim javascript ile bunu nasıl yaparız. Eğer sadece ekranda görünen html tablosunu export almak istiyorsanız, arka tarafa gidip sunucuyu meşgul etmeden ekranda görünen tablo benim işimi görür diyorsanız o zaman hiç java kısmına girmeye gerek yok. Javascript ile bunu da halledebiliyorsunuz:)

Peki nasıl? 

Öncelikle bunda da nasıl bir yol izlemem gerektiğiyle ilgili uzun uğraşlar sonucunda bir iki yöntem ve bu yöntemlerin eksik ya da iyi yanlarını anlatacağım.

İlk önce hiçbir kütüphane kullanmadan javascriptte bu işi nasıl yaparım diye araştırdıktan sonra şöyle bir sonuca ulaştım:

1.Yöntem: 

this.Export = function () {
  window.open('data:application/vnd.ms-excel,' + encodeURIComponent($('#htable').html()));
};

/* burdaki #htable html tablonun id'si isterseniz tablonun class'ını da verebilirsiniz o da şöyle ki $('.className') şeklindedir. */

Bu yöntemde iki büyük sorun söz konusu. Belki basit çözümleri vardır ama bulamadım pek de araştırmadım doğrusu.

Bu şekilde export alabiliyorsunuz ancak makineniz windows değilse dosyayı .xls formatında indiremiyorsunuz. Yani .txt uzantılı olarak indiriyor tabi dosyayı açarken excel programı ile açarsanız sıkıntı olmuyor yine açılıyor.  (İşlemi windowsta denedim .xls olarak indiriyor)

* Bu arada bu kodu nasıl kullanacağım derseniz. Export almak için bir buton ekleyip o butona clickEventi olarak yukarıdaki fonksiyonu atarsanız çalışacaktır.

Bu yöntemin diğer sorunu ise Türkçe karakter problemi.

2. Yöntem
Yukarıdakinin Türkçe karakter problem olmayan hali :)

this.Export = function () {
   window.open('data:application/vnd.ms-excel;base64,' + base64_encode($('#htable').html())); 
};
 
//aşağıdaki kısmı ise internette araştırırken buldum linki veriyorum isterseniz inceleyebilirsiniz.
 
function base64_encode (data) {
  var b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
  var o1, o2, o3, h1, h2, h3, h4, bits, i = 0,
    ac = 0,
    enc = "",
    tmp_arr = [];

  if (!data) {
    return data;
  }

  do {
    o1 = data.charCodeAt(i++);
    o2 = data.charCodeAt(i++);
    o3 = data.charCodeAt(i++);

    bits = o1 << 16 | o2 << 8 | o3;

    h1 = bits >> 18 & 0x3f;
    h2 = bits >> 12 & 0x3f;
    h3 = bits >> 6 & 0x3f;
    h4 = bits & 0x3f;
    tmp_arr[ac++] = b64.charAt(h1) + b64.charAt(h2) + b64.charAt(h3) + b64.charAt(h4);

  } while (i < data.length);

  enc = tmp_arr.join('');
  var r = data.length % 3;
  return (r ? enc.slice(0, r - 3) : enc) + '==='.slice(r || 3);
};
  
 3. Yöntem

Yukarıdaki yöntemlerde windows dışındaki bir makinede dosyayı excel olarak indirme yöntemini bulamadım zaten çok fazla zahmete girmeye gerek de yokmuş diğer çözüm olarak bir excel export işlemini yapan js kütüphanesi bulmak. Arayışlarım sonucunda table2excel.js kütüphanesini buldum. 

 table2excel.js
   jquery'nin bir eklentisi olarak görünüyor. İncelemek veya indirmek isteyenler için ise link veriyorum. Gerçi google'a table2excel.js yazsanız arama sonuçlarında çıkan ilk sayfa burası olacaktır:)
   Yukardaki paragraftan da anlaşılacağı üzere bu kütüphanenin jquery'e bağımlılığı bulunuyor. Yani bu kütüphaneyi kullanmak için uygulamanızda jquery kütüphanesi de bulunmalı.
   Ben table2excel.min.js kütüphanesini kullandım. 
Bu kısa bilgilerden sonra table2excel.js kütüphanesini de import ettiğinizi varsayarak devam ediyorum. Aşağıdaki küçük kod sayesinde istediğim sonuca ulaşmış oldum.
 this.Export = function () {
   $(".js-htable").table2excel({
     exclude: ".js-htable",
     filename: "Download"   });
}; 
 
Bu yazıyı okuyan uzman yazılım geliştiricilerimiz varsa ve büyük hatalarımı görüyorlarsa affola :) Umarım faydalı olmuştur. Sevgiler.

23 Mayıs 2015 Cumartesi

Git Komutları İşlevleri ve Kullanımı

   Github uygulamalarınız için oldukça kullanışlı bir depo alanıdır. Özellikle takım çalışmalarında oldukça faydaları vardır. Aslında sadece kendinizin üzerinde çalıştığınız projelerinizi de github'a yüklemeniz projenizdeki geliştirdiğiniz özellikleri adım adım görmeniz ve takip etmeniz açısından oldukça kullanışlı.Projenizi github'a yükledikten sonra yaptığınız her commit için, güzel bir commit mesajı oluşturmak bu noktada önemli bir ayrıntı oluyor. Her commitinizde, hangi özellikleri geliştirdiğiniz, ya da değiştirdiğiniz özellikler, düzelttiğiniz hatalar varsa bunları ayrıntılı bir şekilde commit mesajında yazmak oldukça faydalı oluyor. Tabi kod içerisinde de yorum satırları eklemek aynı şekilde yarar sağlayabilir. Sizin tercihinize kalmış bir durum :) Yorumlar kodunuzda kalabalık yapsın istemiyorsanız commit mesajlarını ayrıntılı yazmak iyi bir tutum olur düşüncesindeyim.

   Github.com sayfasından ücretsiz yararlanabiliyorsunuz ancak projeleriniz public olarak paylaşılıyor, private yapmak isterseniz belirli bir ücret ödemeniz gerekmektedir. Projenize başka geliştiriciler ekleyebiliyorsunuz ve projeniz için farklı branchlar oluşturabiliyorsunuz. Şimdi gelelim git işlemlerine. İşlemleri yine linux üzerinden anlatacağım ve terminal komutları şeklinde göstereceğim. Git işlemlerini aynı şekilde kullandığınız yazılım geliştirme araçlarından da yapabiliyorsunuz. Windowsta çalışırken de eclipse üzerinden git işlemlerini gerçekleştiriyordum ama çıkabilecek hataları ve çakışmaları yönetmek oldukça zorluyor. Bu yüzden terminalden bu işlemleri yapmak çok daha kolay bence.

   Bu yazımda git komutlarını anlatacağım, git nedir, komutların anlamları vs derinlemesine yazmayacağım. Zaten bunları anlatan internette oldukça fazla kaynak bulabilirsiniz. Oyüzden ben bu yazımda daha çok nasıl kullanıldıklarını anlatacağım. Bakmak isterseniz diye en gerekli komutları aşağıya yazıyorum:

Git Komutları

config
clone
init
remote
add
commit
push
merge
pull
fetch
stash
rebase
vb.


Git Komutları Kullanımı

   Git işlemlerinizi https veya ssh üzerinden yönetebiliyorsunuz. Ssh üzerinden yaparsanız her komutta kullanıcı adı ve şifre girmenize gerek kalmıyor, ama https üzerinden girerseniz her pushlama işleminde kullanıcı adı ve şifre gerekmekte.

   Tabiki bu işlemlere başlamadan önce github sitesine üye olmanız gerekmekte. Üye olduğumuzu düşünerek işlemlere devam edelim.

Git'i install etmek için terminalden:

$ sudo apt-get install git

Yapılandırma için:

$ git config - -global user.name "kullanıcı adınız"
$ git config - -global user.email "email adresi"

Ssh işlemleri için ssh-key lazım eğer yoksa yeni oluşturmak için aşağıdaki komutu yazıyoruz:

$ ssh-keygen

Bu komut üzerine bazı onay işlemleri gelir hepsini onayladıktan sonra,

the key fingerprint is :bf:80... seklinde key gelir ya da ~/.ssh/id_rsa.pub dizininde key'in oluşmuş olması gerekli. Bu key'i github'a eklememiz gerekmekte, Github sayfasında ayarlar menüsünden Ssh bölümünde Add ssh butonu ile ekleyebiliriz.

Bu işlemi bir kez yapmanız yeterli olacaktır. Ben github için ssh ile deneme yapmadım. https kullanarak işlemlerimi gerçekleştiriyorum.

Github'tan Bir Projeyi Localinize Çekmek İçin:

   Github'ta bir projenin sayfasına girdikten sonra sağ tarafta Https clone URL diye bir alan var buraya tıklayınca projenin URL'ini kopyalıyor daha sonra aşağıdaki tek bir komutla projeyi çekebiliyorsunuz.

$ git clone URL

Github'a Proje Yüklemek İçin:

   İlk önce github'ta projenizi konumlandıracağınız bir repository açmanız gerekmektedir. Githubta kendi profil sayfanızda yer alan repositories tabbına tıkladıktan sonra orada yeralan new butonu ile repository oluşturabiliyorsunuz. Repository'i oluşturdukdan sonra, repository'inin url'ini veriyor.

   Repository'miz için default olarak "master" branchını bize vermektedir. Branch dediğimiz ise projeyi dallara ayırmak için kullanılır. Yani projemizin iki dalı olsun biri develop biri master olsun. Ben yazdığım kodları ilk önce develop branchına göndersem daha sonra doğruluğunu test ettikten sonra bu komutları master branchına göndersem bu durumda projenin düzgün, çalışan bir versiyonu master branchında tutulmuş olur. Yani doğru çalıştığından emin olduğum bir kodu master branchına göndermem oldukça yararlı olacaktır. Tabi bu durum proje canlıda ise yani proje hali hazırda kullanılıyorsa projenin çalışan halinin üzerine yapacağım güncellemeleri önce develop branchına gönderip orada denemek daha sonra master branchına göndermek oldukça mantıklı bir durum olacaktır. Bu kullanım takım çalışmalarında da oldukça yarar sağlamaktadır. Takımın her üyesi tarafından kod gözden geçirildikten sonra master branchına alınmasına olanak sağlar, hem hata olasılığı oldukça azaltılmış olur hem de kodun kaliteliği güvence altına alınmış olur bu sayede de canlı ortamda çalışan programı bozmadan düzgün güncellemeler gitmiş olur. Bu kadar açıklamadan sonra dilerseniz yeni branch oluşturup, projenizi dallara ayırabilirsiniz. Şimdilik sadece master branchım var gibi komutları yazacağım.

Şimdi aşağıdaki komutları sırası ile yazıyoruz:

$ cd myApplication   (Projemizin olduğu dizine gidiyoruz)
$ git init
$ git remote repositoryURL   (buraya repositorynin url'ini yazmanız gerekmekte)
$ git add . veya $ git add --all (bu komutla projenizdeki yeni dosyaları eklemiş oluyorsunuz, projemizi ilk defa git'e yükleyeceğimiz için bu komutla projenin tüm dosyalarını yeni olarak algılayacağı için tüm dosyalar eklenmiş oluyor. Daha sonra commit yapılacağı zaman, git'te var olan projenin üzerine hangi değişiklikler yapılmışsa onları ekler.)
$ git commit -m "buraya commit mesajınızı yazabilirsiniz "
$ git push veya $ git push origin master (bu komutla projemizi git'e göndermiş olduk. git push yaptığımızda branch adını vermezsek default olarak master'a pushlayacaktır. Şuan bizim başka bir branchımız olmadığı için her koşulda master'a pushlayacak oyüzden branch adı vermesek de olur)


Şuan projemizin ilk commit'ini gerçekleştirmiş olduk. Daha sonra projemize yeni özellikler ekledik diyelim ve şuan makinemizdeki projemiz git'teki yüklenmiş halinden farklı oldu. Projenin son halini (kodda silebilirsiniz veya ekleyebilirsiniz sonuç olarak bizim localimizdeki proje git'te olandan bir satır bile olsa farklı hale geldiyse, bu değişikliği algılayacaktır.)
Şimdi projemize yeni bir commit ekleyelim.

$ cd myApplication
$ git status (olduğumuz branchı ve değişiklik yapılan dosya isimlerini gösterir)
$ git diff (bu komutla yaptığımız değişiklikleri detaylı bir şekilde görebiliriz. enter ile ilerler, q ile bu komut satırından çıkış yaparız)
$ git add . (yapılan değişiklikleri ekledik, istersek burada eklemek istediğimiz dosyaların path'lerini de verebiliriz.)
$ git commit -m "mesajınız"
$ git push origin master


Eğer gönderdiğiniz son committe değişiklik yapacaksanız aşağıdaki komutları yazmanız yeterli:

$ git add .
$ git commit --amend (bu komutla commit mesajınızın olduğu bir alan açılır, burada commit mesajınızı düzenleyebilirsiniz. Eğer düzenlemeyecekseniz, ctrl+x ile bu alandan çıkarsınız. Değişiklik yaparsanız ctrl+x ile çıkarken size yapılan değişikliği kaydedip kaydetmediğinizi soracaktır. Bu mesaja "yes" veya "y" yazmanız yeterli.)
$ git push -f origin master (bu komutla force push yapmış oluyoruz. Force push şuan benim localimde kod nasılsa, aynı şekilde onu git'e gönderir. Bu komuta dikkat etmek gerekir. Çünkü eğer gitteki değişiklikleri localimize çekmeden force push yaparsak git'e projenin eksik hale gönderilmiş olabilir. İşte bu noktada yine branch açmak fayda sağlayabiliyor.)

Projenin son halini localimize çekmek için:

$ cd myApplicaiton
$ git status (hangi branchtayız bir bakalım)
$ git checkout origin master (Eğer başka branchlarımız varsa master branchındaki son güncellemeleri localimize çekiceksek, master branchında olmamız için kullandık)
$ git fetch (tüm değişiklikleri çektik)
$ git pull (tüm değişiklikleri localimizdeki kod ile birleştirdik bu komut için branch adı vermek de mümkündür- git pull origin master gibi.)

Localimizdeki projeyi herhangi bir branch'a resetlemek için:

$ git reset --hard origin/master (bu komutla bizim localimizdeki kod, pull komutuyla master branchının çekilmiş en son haline resetlenmiş olur, eger değişiklik yaptıysak ve bunu commitlemediysek bu değişikliği kaybederiz)

Şimdi localimizi master'a resetlemek istiyoruz ancak commitlemediğimiz değişikliklerimiz var ve bunları da kaybetmek istemiyorsak:

$ git stash (bu komutla yapılan değişiklikleri farklı bir depolama alanına taşımız oluruz. değişiklikler burada saklanır.)

$ git stash pop (bu komutla ise yaptığımız değişiklikleri tekrar alırız)

$ git stash drop (artık ihtiyaç yoksa saklanan değişiklikleri bu komutla temizleriz)
$ git stash list (bu komut ile yapmış oldugumuz her değişikliği görüntüleriz, çünkü her yaptığımız stash işleminde bunları ayrı ayrı kaydeder ve pop ile bu değişikliği almak istediğimizde listenin en üstündekini alır.)

Yeni branch açmak için:

$ git checkout -b yeniBranchAdı

veya;

$ git branch  yeniBranchAdı

$ git checkout yeniBranchAdı

Localimizde çektiğimiz veya açtığımız tüm branchları görmek için:

$ git branch


Bir branchı silmek için:

$ git branch -D branchName


Git-flow Komutları:

  • Öncelikle git-flow'u install etmemiz gerekmekte:
        $ sudo apt-get install git-flow

  • Flow komutuyla yeni bir branch açmak için:
        $ cd myApplication
        $ git flow feature start branchName

  • Bir branch'ı flow komutuyla localimize çekmek için:
        $ git flow feature track branchName


Farklı branchları Birleştirme:

Diyelim ki projemizde iki farklı değişikliği iki farklı brachta yaptık yani şöyle:

Ben bir özellik geliştirdim ve bunu özellik1 branchında yaptım, commitledim ve bu brancha pushladım.

Diğer özelliği ise özellik2 branchında yaptım, commitledim ve bu brancha pushladım diyelim.

Projenin güncel hali ise master branchında olsun. Benim bu iki branchtaki özellikleri master branchına taşımam yani orada da bu iki özelliğin bulunması için bu iki branchı  master branchı ile birleştirmem gerekiyor. Bu işleme ise merge işlemi deniliyor

Açıkcası hiç terminalden bu işlemi yapmadım. Hep git sayfasından merge işlemi yapıyorum. (bir buton ile :) ) Oyüzden yanlış bir şeyler söylemim. Şu sayfa belki size yardımcı olabilir-> http://git-scm.com/docs/git-merge

Rebase İşlemi:

Yukarıdaki verdiğim branch örneğinde, master branchına merge olmamış iki branchta özellikler vardı diyelim ki bu iki özellikte de aynı dosyalar üzerinde değişiklik yaptık. ozellik1 branchını master branchına merge ettikten sonra diğer ozellik2 branchını merge etmek istersem, çakışma olacaktır ve rebase işlemi yapmam gerekecektir.

ozellik1 branchını master branchına merge ettikten sonra:

öncelikle master branchına geçiyoruz:

$ git checkout master

Şimdi master branchındaki tüm değişiklikleri almamız gerekiyor:

$ git fetch
$ git pull


Şimdi ozellik2 branchına geçiyorum:

$ git checkout feature/ozellik2

 Sıra geldi rebase işlemine, ozellik2 branchını hangi brancha merge edeceksek rebase yanına o branchı yazıyoruz:

$ git rebase origin/master
$ git status

Eğer herhangi bir conflict yoksa sorunsuz bir şekilde rebase işlemi gerçekleşmiş olacaktır ve o şekilde bir mesaj gelir.

Eğer conflict varsa bu durumda manuel olarak merge etmeniz gerekir. Rebase olamayan dosyalara girip masterdan  gelen güncellemeleri silmeyip onun üzerine düzenleme yapmalısınız. Dosyanın içinde ">>>>HEAD" gibi şeyler olacaktır onları silmeniz gerekiyor. Düzenlemene bittikten sonra:

$ git add .
$ git rebase --continue
$ git commit --amend
$ git push -f origin feature/ozellik2

Şimdi rebase işlemi tamamlanmış ve son halini pushlamış olduk. Şimdi ozellik2 branchı merge olabilcek hale gelmiş oldu.

Benim git ile ilgili anlatabileceklerim şimdilik bu kadar:)

















20 Mayıs 2015 Çarşamba

Play Framework İntellij İdea ile Uygulama Geliştirme (Linux-Ubuntu Gnome)

Bu yazımda intellij idea'ya bir play projesinin import edilmesini anlatacağım. Tabiki makinemizde play framework ve intellij idea kurulu olmalı :) Ve tabiki java 1.8 versiyonu yüklü olduğunu varsayıyorum. şuradan  idea'nın linux için olan versiyonunu indirip kurabilirsiniz. Benim makinemde idea-IU-141.178.9 ve play framework 1.3 sürümü bulunmakta.

Önceki yazımda yeni bir play uygulaması oluşturmayı göstermiştim. Buradan bakabilirsiniz. Oyüzden ben şuan bir play uygulamam var olduğunu  düşünerek devam ediyorum.

Play projesini idea'da çalıştırabilmek için öncelikle terminalden proje dizinine gittikten sonra aşağıdaki komutu yazmanız gerekmektedir.

$ cd Uygulamam
$ play idealize

Şimdi uygulamamız idea'da çalışabilir hale geldi.

İntellij idea'yı açtıktan sonra, projemizi import etmek için;

Üstteki menülerden File/Open seçeneğini kullanabilirsiniz. Buradan uygulamanın yolunu gösterip ekliyoruz.

Daha sonra idea'da play ve java ayarlarını yapmamız gerekiyor. Yine üst menülerdeki Run/Edit Configurations'a tıklıyoruz. Buradan play framework için ayarları yapmak gerekiyor.  Aşağıdaki sayfa karşımıza geliyor.


 
Burada solda olan + butonuna tıklıyoruz altta açılan menuden application seçiyoruz daha sonra sağ tarafta açılan formda configuration ayarlarını yapmak gerekiyor.
Main classa play.server.Server
VM options kısmına : -Dapplication.path="." -noverify yazıyoruz.
Working directory projenin yolunu gösterir.

Bir de burada java versionumuzu seçmek gerekiyor. Use alternative JRE checkboxını işaretleyip makinemizde hangi JRE yüklü ise o versiyonu seçiyoruz. (son version olmasına özen göstermekte fayda var, benim önerim javanın 1.8 versiyonuna biran önce geçmeniz:))

Bu işlemi tamamladığımızda Run menüsu altına run 'Play' ve debug 'Play' öğelerinin gelmiş olması gerekiyor.

Bazı olası hatalarla karşılaşmanız mümkündür. Onları da hatırlatma olarak yazayım. Benim başıma geldiğinden tecrübeliyim:)

Makinenizde hangi java versiyonu yüklü ise bu ayarı idea'da yapmanız gerekiyor yoksa hata alıyorsunuz.

Bu ayarları da File/Project Structure'a tıklayıp buradan java kısımlarını 1.8 olarak güncelliyoruz:



Ayrıca burdaki sol taraftaki menülerden Project'e tıklıyoruz: Java versionunu 1.8 yapıp Project language level kısmını ise 8-Lambdas,type annotations etc olarak düzenliyoruz.

Projenin Project.iml dosyasındaki javanın versiyonunun düzgün yazdığından emin olun. (play ve java versionlarını burada da güncellemeniz gerekiyor) şu satırı düzenlemeniz yeterli:

  <orderEntry type="jdk" jdkName="1.8" jdkType="JavaSDK" />

Ayrıca eğer projenizi terminalden çalıştırdıysanız port çakışması hatası vermemesi için, projeyi terminalden durduktan sonra idea'dan çalıştırmanız gerekir.

Ben projeyi ilk çalıştırdığımda hiçbir model  dosyam olmadığı için "idea error is java package models does not exist" şeklinde bir hata almıştım. Oyüzden  modele sag tıklayıp new java class deyip yeni bir model olusturdum ki hata vermesin ve projeyi tekrar run play dediğimde hatasız çalıştırdı ve localhost:9000'de playin default sayfası görüntülendi.  Ve ideanin consolunda şöyle bir çıktı veriyor:

 INFO  ~ Starting /home/snm//TestProject/.
 WARN ~ You're running Play! in DEV mode
 INFO ~ Listening for HTTP on port 9000 (Waiting a first request to start)...
~ Server is up and running

 INFO  ~ Application 'TestProject' is now started !










19 Mayıs 2015 Salı

Play Framework ile İlk Uygulama (Linux-Ubuntu Gnome)

Play Framework  web uygulamaları geliştirmek için tüm gerekli olan bileşenler ile API’leri bir araya getiren, Java ve Scala programlama dilleri için geliştirilmiş web uygulama çatısıdır.

Play'in özelliklerine bakacak olursak;
  •  Durumsuz olması(yani kullanıcıların sayfa bilgilerini bir yerde saklamıyor)
  •  Düşük kaynak tüketimine (CPU, bellek, thread vs.) sahip olması
  •  Play framework, nerdeyse tüm veritabanları ile birlikte çalışabilmesi
  •  MVC(model view controller) kullanması
  •  Java kütüphanelerini içinde bulundurması
  •  Kendi uygulama sunucusu ile beraber geliyor olması
  •  Unix-Linux, Windows ve Mac OS tabanlı isletim sistemlerinde çalışabilir olması.
  •  Kodlamada belli bir standart sağlaması ( css,js gibi dosyalar, kaynak kodlar birbirinden ayrılmıştır. Bu şekilde bir düzen sağlanmıştır.)
  •  Selenium ile web uygulamanız için test yazımını desteklemesi

ve daha bir sürü özellikleri var tabi ama ben bu kadarı ile yetineceğim:)

Şimdi makinemize play'in kurulması ve ilk uygulamanın oluşturulması aşamasına gelecek olursak;

Play framework’ü çalıştırmak için ön koşul olarak JDK 6 ya da sonrası gereklidir.

Linux için OpenJDK kurmak yeterlidir.

Play'in istediğiniz sürümünü Play'in kendi sitesinden https://www.playframework.com/download indirebilirsiniz, kurulum aşamalarını da her işletim sistemi için güzel bir şekilde anlatmışlar.

Playi kurduktan sonra, play.bat dosyasını path ‘e ekleyinki terminalde herhangi bir dizindeyken sadece play deyince çalışabilsin.

Şimdi play framework ile ilk uygulamamızı oluşturalım:

Ubuntuda terminalden, projenizin hangi klasörde oluşturulmasını istiyorsanız o dizine giderek, o dizindeyken;

$ play new UygulamaAdı

komutunu yazdığınızda  size o klasörde UygulamaAdı adında bir play uygulaması oluşturur.

Daha sonra uygulamamızı çalıştırmak için uygulamanın oldugu dizine gidip yani terminale aşağıdaki komutları yazmanız yeterli:

$ cd UygulamaAdı
$ play run

Şimdi uygulamamız tarayıcıda play frameworkun default portu 9000'den çalışır hale geldi. Tarayıcınıza localhost:9000 yazarsanız play frmework'un default sayfası gelecektir.

 Bir Play Projesinin Yapısı
 Biz terminalde play new dediğimiz zaman uygulamamız oluşur ve aşağıdaki gibi bir dizin yapısı üretir:

/: Uygulamanın kök dizinidir.

/README: Uygulamayı tanıtan bir metin dosyasıdır.

/app: Uygulama kodlarının tutulacağı dizindir. Bu klasörün altında 3 tane daha alt klasörü bulunur:
          - controllers
          - models
          - views
şeklindedir. Bunlar Java ve Scala kaynak kodlarının bulunduğu kısımdır.

/conf:  Konfigürasyon dosyalarının bulunduğu klasördür. Yani uygulama için yapılandırma dosyaları bulunur. Altında iki klasör daha bulunur:
          - application.conf/: Ana ayarların olduğu dizindir.
          -  routes/: Routeların tanımlandığı yerdir.

/project: sbt build tanımlarının bulunduğu klasördür. Alt klasör ve dosyaları vardır
          -plugins.sbt dosyası : Projede kullanılan sbt pluginlerinin tanımlandığı dosyadır.
          -build.properties dosyası : Projede kullanılacak sbt versiyonunun tanımlandığı yerdir.

/public: Uygulamadaki sabit ve public olan şeylerin saklanacağı dizindir.
 Statik olarak kullanılan css, js ve diğer dosyaların olduğu webserver gibi kullanılan alandır.

/target : Kodlar build edildikten sonra ortaya çıkan herşey burda bulunur.

/test: Uygulamadaki test kodlarının saklanacağı dizindir.






14 Mayıs 2015 Perşembe

Blogger Olmaya İlk Adım :)

Merhabalar,

   Çalışmaya başladığımdan beri (yaklaşık 8 ay oluyor) sürekli bir şey araştırma gereği duyuyorum. Araştırdığım konu hakkında daha önceden eğer hiçbir fikrim yoksa, o konuyu öncelikle türkçe bir iki kaynaktan okumak istiyorum. Bu konuda da bana bloglar oldukça yardımcı oluyor. Öyleyse ben de neden bildiğim, uğraştığım konular hakkında başkalarına yardımcı olmayayım? Bir de hangi konuda çalışırsam genelde dökümantasyona önem veriyorum. Ne yapıyorsam adım adım yazıyorum ki çok sonra o işi tekrar yaparsam o notlarım bana yardımcı oluyor.  Ben aradığım bir konu hakkında Türkçe bir blog yazısı bulursam çok mutlu oluyorum ve defalarca teşekkür ediyorum blog sahibine:)
Sözün özü ben de bu nedenlerden dolayı blog yazmak istedim. Blog yazılarım daha çok bir konu hakkında temel şeyler değil de biraz daha ayrıntı bilgiler olacak. Çünkü zaten bir konu hakkında temel bilgiye kolayca erişebiliyorsunuz.

    Bazı konularda türkçe kaynak olmamasından dolayı bir hayli zorlandım oyüzden belki benim gibi bir şeyleri ilk önce Türkçe okumak isteyenlere yardımcı olabilirsem ne mutlu :)