Solr java ile geliştirilmiş açık kaynak kodlu, Tomcat ve Jetty gibi sunucular üzerinde çalışabilen tam metin arama kütüphanesidir.
Solr herhangi bir programlama dili kullanmadan sunucuya kurulur. Solr ile verileri sunucuda indexleriz. Bu veriler üzerinde arama yapabilmeyi Solr ile sağlarız.
Solr için veriler Document olarak adlandırılıyor.
Documentleri veritabanındaki satırlar olarak düşünebiliriz.
Documentin fieldları vardır. Bunu da veritabanındaki sütunlar olarak düşünebiliriz.
İndekslenen bu veriler üzerinde http isteği ile sorgulama yaparak sonuçları çok hızlı bir sekilde çekebiliriz.
Veriler xml, json, binary gibi formatlarda alınabilir.
Örnek Sorgular :
Solr'ı bir serverda kurduğumuzu ve solr şemamızı oluşturduğumuzu varsayarak;
http://solr-server-adresiniz/solr/solr-semaniz/select?q=*:*
ile HTTP Get Request ile sorgulamalarımıza cevap alabiliriz.
Bu sorgu solr için parametresiz default sorgudur ve cevap şu şekilde döner:
{
"responseHeader":{
"status":0,
"QTime":0,
"params":{
"q":"*:*"}},
"response":{"numFound":1,"start":0,"docs":[
{
"id":"1",
"name":"Asus Bilgisayar",
"type":1,
"time":1508950750836,
"description":"ASUS Masaüstü Bilgisayar."
}]
}}
numFound: toplam veriyi(totalCount) ifade eder.
start: kaçıncı satırdan itibaren verileri çektiğini ifade eder.
id, name, type, time, description ise bizim şemamızda belirttiğimiz fieldlardır.
Herhangi bir parametre vermediğimizde veriler json formatında gelir ve ilk 10 veriyi gösterir.
Paging:
Veri dönüş tipini ve indexlenen data sayısını parametremize eklemek için; rows=20&start=5&wt=json parametresini eklemeliyiz.
http://solr-server-adresiniz/solr/solr-semaniz/select?q=*:*&rows=20&start=5&wt=json
şeklinde sorgu yapılır.
rows: kaç satır veri getirileceğini
start: kaçıncı satırdan itibaren veri getirileceiğini
wt: verinin hangi formatta geleceğini simgeliyor.
Bu sorgunun cevabı ise şöyle olur :
{
"responseHeader":{
"status":0,
"QTime":0,
"params":{
"q":"*:*",
"start":"5",
"rows":"20",
"wt":"json"
}},
"response":{"numFound":1,"start":0,"docs":[
{
"id":"1",
"name":"Asus Dizüstü Bilgisayar",
"type":1,
"time":1508950750836,
"description":"ASUS Masaüstü Bilgisayar."
},
{
"id":"2",
"name":"HP Masaüstü Bilgisayar",
"type":1,
"time":1508950764439,
"description":"HP Pavilion 250 G6 1WY08EA Notebook."
},
{
"id":"3",
"name":"Note8 Cep Telefonu",
"type":2,
"time":1508950764439,
"description":"Samsung Note8 Android Cep Telefonu"
},
..............]
}}
Keyword Bazlı Sorgulama
name=Bilgisayar parametresi name name field'ında Bilgisayar geçen verileri getirir.
http://solr-server-adresiniz/solr/solr-semaniz/select?q=name=Bilgisayar
Keyword AND ve OR kullanımı
Diyelim name field'ında hem HP hem Dizüstü Bilgisayar olan verileri getirmek istiyoruz.
http://solr-server-adresiniz/solr/solr-semaniz/select?q=name=HP&name=Dizüstü+Bilgisayar şeklinde sorgu yapmak gerekiyor. (+ yerine %20 yazılabilir)
Ancak içerisinde HP veya Bilgisayar kelimeleri geçsin istersek:
http://solr-server-adresiniz/solr/solr-semaniz/select?q=name=HP,Dizüstü+Bilgisayar
şeklinde sorgu yapılır.
Tarih parametresine göre sorgu
Tarih değerlerini timestamp olarak tuttuğumuzu düşünelim;
* http://solr-server-adresiniz/solr/solr-semaniz/select?q=time=201508954448138
* http://solr-server-adresiniz/solr/solr-semaniz/select?q=time=[1508950849092%20TO%201508954448138]
* http://solr-server-adresiniz/solr/solr-semaniz/select?q=time=[*%20TO%201508954448138]
* http://solr-server-adresiniz/solr/solr-semaniz/select?q=time=[1508950849092%20TO%*]
Solr Sıralama (sorting):
name alanına göre alfabetik sıralama yaparsak; parametrek olarak fq=name+asc eklemek gerekiyor;
http://solr-server-adresiniz/solr/solr-semaniz/select?fq=name+asc&q=*:*
Eğer tersten sıralamak istiyorsak asc yerine desc yazmak gerekiyor.
Sinem Akkoyun Sevdik
6 Kasım 2017 Pazartesi
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.
Ö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
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)
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 :)
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 :)
Sevgiler.
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.
Ç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:
/* 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 :)
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.
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.
Etiketler:
Excel,
Excel Export,
Export,
framework,
Handsontable,
java,
Java Excel Export,
Javascript,
Javascript Excel Export,
jquery,
play,
play framework,
Play Framework Excel Export,
table2export,
table2export.js
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ı:
$ git flow feature start 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:)
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:
- Flow komutuyla yeni bir branch açmak için:
$ git flow feature start branchName
- Bir branch'ı flow komutuyla localimize çekmek için:
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:)
Kaydol:
Yorumlar (Atom)
