8 Ocak 2018 Pazartesi

Segmentify'da Bir Ay




Merhabalar,
Bu sene tempolu bir okul dönemini geride bıraktıktan sonra üniversiteden mezun oldum. Bu yoğun sınavların, projelerin ardından kendime bir süre tatil verdikten sonra ilk işimi aldım ve Segmentify'da çalışmaya başladım. Yaklaşık 1 aydır çalışıyorum. Hem size biraz buradan bahsetmek için hem de kendime bir değerlendirme yazısı olsun diye yazayım istedim :)

Segmentify ne yapıyor ?



Segmentify e-ticaret odaklı kişiselleştirme platformudur. Segmentify, özellikle e-ticaret siteleri için ziyaretçi davranış analitiği (Click Stream Analysis) ve pazarlama otomasyonu gibi veri odaklı hizmetler sunuyor. Aralarında n11.com, hepsiburada.com ve Boyner gibi Türkiye’nin önde gelen e-ticaret markalarına kişiselleştirme hizmetleri sunan Segmentify, hali hazırda 8 ülkede 100’den fazla e-ticaret sitesine hizmet sunuyor. Operasyonlarını Avrupa ve MENA bölgesinde yaygınlaştırarak büyümek isteyen girişim e-ticaret sitelerine en az yüzde 10’luk gelir artışı vadediyor.

Segmentify'da ben ne yapıyorum ?



Junior software developer pozisyonunda çalışıyorum. Temel olarak Java ile web programlama yapıyorum. Ancak bunun yanında benim için yeni olan pek çok teknoloji ile tanıştım. Jenkins ile job create etme, bunları zamanlama, git push ve pull requestlere göre trigger etme, maven uygulama geliştirme, quartz job kullanımı gibi yeni bilgiler öğrendim. Sadece bir ayda bile pek çok yeni kavramdan haberdar oldum. Ben ürettikçe mutlu olan bir insanım ve burası bana tam olarak bunu sunuyor diyebilirim. 

Segmentify'da çalışmak çok keyifli ve huzurlu. Ofis ortamı eğlenceli, insanlar pozitifler. Çekinmeden her şeyi sorabiliyorum bana çokça vakit ayrılıyor. ( Bunun için Candan'a da teşekkür etmiş olayım burdan, ondan öğreneceğim daha çook şey var). Bir sorun varsa herkes yardımcı olmak için elinden geleni yapıyor. Başlangıcım Segmentify olduğu için kendimi şanslı hissediyorum umarım Segmentify'da daha uzun zaman dilimlerini anlatacağım yazılar paylaşırım. Sonraki yazıda görüşmek üzere :) 

10 Aralık 2017 Pazar

Quartz Scheduler



Uygulamalardaki en kritik konulardan biri de belli bir saatte çalışması planlanmış işlerdir. Bu işlemler arka planda, kullanıcı ile bir etkileşimi olmadan çalışıyor.
Quartz açık kaynaklı bir uygulamadır ve her türlü Java uygulamasının bir parçası olarak çalışabiliyor. Quartz, Trigger diye adlandırılan bir tetikleme mekanizmasına sahiptir. 


Quartz kullanım olarak 2 aşamadan oluşuyor. Birincisi çalışacak olan job belirleme, ikincisi hangi zaman aralıklarında çalışacağı bilgisini düzenlemek. Quartz 3 ana bileşenden oluşuyor. Bunlar "job, trigger, schedular"dır. Job yapılacak olan iştir. Trigger job'ın ne zaman, ne şekilde tetikleneceği emrini veren yapıdır. Job ve Trigger ikisi birlikte schedular'a register olurlar. Kısaca çalışma şekli olarak; job schedular üzerinden trigger tarafından çalıştırılıyor. 

 Projeye Quartz'ı eklemek
Tam dağıtımı(with examples, source, dependencies, doc, etc.) indirebilirsiniz veya Maven kullanıcısıysanız bağımlılıkları ekleyebilirsiniz.
  <dependency>
      <groupId>org.quartz-scheduler</groupId>
      <artifactId>quartz</artifactId>
      <version>2.2.1</version>
  </dependency>
 Bir Schedular başlatın
 Schedular'lar Factory'ler tarafından oluşturulur ve onların .start() methodu çağırılıncaya kadar hiçbir işlem başlatılmayacaktır.
  Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
  scheduler.start();
Quartz Fluent Scheduling API ile kodlama  
API bileşenlerini static olarak import etmeliyiz.
  import org.quartz.Scheduler;
  import org.quartz.SchedulerException;
  import org.quartz.impl.StdSchedulerFactory;
  import static org.quartz.JobBuilder.*;
  import static org.quartz.TriggerBuilder.*;
  import static org.quartz.SimpleScheduleBuilder.*; 
Bunu yaptıktan sonra .execute() methoduna sahip olan Job'ı implement edebilirsiniz.
  public class MyJob implements org.quartz.Job {

      public MyJob() {
      }

      public void execute(JobExecutionContext context)  
        throws JobExecutionException {
          System.err.println("Hello World!  MyJob is executing.");
      }
  
Sonra bu jobları ne zaman çalıştırılacağını tanımlayan triggerlar ile zamanlayın.
 //İşi tanımlayın ve MyJob sınıfına bağlayın
   JobDetail job = newJob(MyJob.class)
      .withIdentity("job1", "group1")
      .build();
//Şimdi Job'ı tetikleyin ve her 40 saniyede bir tekrarlansın. 
  Trigger trigger = newTrigger()
      .withIdentity("trigger1", "group1")
      .startNow()
      .withSchedule(simpleSchedule()
              .withIntervalInSeconds(40)
              .repeatForever())
      .build();
//Quartz'a triggerı kullanarak işi zamanlamasını söyle
   scheduler.scheduleJob(job, trigger); 
Daha fazlasını öğrenmek isterseniz ayrıca Quartz'ın kendi web sitesinde çok iyi bir tutorial da hazır bulunuyor. Gelecek yazıda görüşmek üzere o/





12 Nisan 2017 Çarşamba

Özgür Yazılım ve Linux Günleri 2017

   

   Merhabalar, bu hafta sonu "Özgür Yazılım ve Linux Günleri" için İstanbul'daydım. Özgür Yazılım ve Linux Günleri, 2002’den beri her yıl ilkbaharda düzenlenen, alanının en büyük ve köklü etkinliğidir. Bu yıl 8-9 Nisan 2017 tarihlerinde, Santralİstanbul’da yapıldı. Etkinliği, Linux Kullanıcıları Derneği ve İstanbul Bilgi Üniversitesi beraber düzenledi. Etkinlik boyunca paralel 2 salonda gerçekleşen oturumlarda 40'tan fazla konuşmacı, 30'a yakın konu başlığında bilgi ve deneyimlerini aktardılar. Seminerler, kısa oturumlar ve hızlı konuşma oturumlarının yanı sıra, çeşitli çalışma toplantıları da etkinlik programında yer aldı.

Etkinlik programı için : https://ozguryazilimgunleri.org.tr/2017/program.html


   Her yıl olduğu gibi etkinlik özgür yazılımla ilgilenen herkesin katılımına açık ve ücretsizdi. Etkinlik alanına ulaşım için birkaç noktadan servis ayarlanmıştı. Etkinlik boyunca uzun yılların verdiği deneyim ve birikimi farkediyorsunuz, Türkiye'deki özgür yazılım insanlarını bir kez daha bir araya getiren bu etkinliğin, çeşitli alanlarda özgür yazılımlar ve uygulamaları hakkında farkındalık yaratmayı bir kez daha başardığını düşünüyorum.


   Biz her yıl olduğu gibi bu yıl da Çanakkale'den kalabalık bir ekiple oradaydık. Okulumun özgür yazılım gönüllüsü olan mezun öğrencileri ile görüşmek kısa sohbetler etmek her zamanki gibi çok güzeldi. Çanakkale'de bulunduğumdan dolayı çok sık göremediğim ve sevdiğim insanlarla görüşmenin tadı bir başka tabiki.


  Sevgili Chris Stephenson Hocanın, Fonksiyonel Programlama ve Özgür Yazılımlar katıldığım ilk sunumdu. Chris hocanın dikkat çektiği konular oldukça önemliydi. 2 gün boyunca dinlediğim en ufuk açıcı sunum oldu. Chris Stephenson yalnızca Türkiye'nin değil tüm dünyadaki yazılım eğitimine vurgu yaptı.

   Özgür Yazılım Çevirmenleri Buluşuyor başlıklı, Necdet Yücel, Kaan Özdinçer, Muhammet Kara, Selim Şumlu gibi değerli özgür yazılım insanlarını buluşturan  önemli bir oturum da vardı. Bildiğiniz gibi yazılım çevirisi hiç bitmeyen bir süreç. Tamamen gönüllülerce sürdürülen bu işin özellikle aktif olarak geliştirilen yazılımlarda sürdürülmesinin oldukça güç olduğuna dikkat çekildi. Belli bir seviyeye getirilen çeviri oranı eğer güncellenmezse hızlıca aşağılara düşebiliyor bunun önemi vurgulandı. Bu iş için büyük bir özveri ile çalışan bu insanlar, katkı vermek isteyen gönüllüleri beklediklerini anlattı.

Katıldığım diğer sunumlar;

    IoT Sistemler ve Güvenlik   — Barkın Kılıç


   Masaüstünde Özgürlük   — Barış Büyükakyol


    Bitcoin, Bu Nasıl Özgürlük Ya?   — Engür Pişirici


   Özgür Yazılımlarla Siber Tehdit Avcılığı  — Huzeyfe Önal


   Knet ile Derin Öğrenmeye Giriş  — İlker Kesen


  Özgür Yazılım Çevirmenleri Buluşuyor — Necdet Yücel, Kaan Özdinçer, Muhammet Kara, Selim Şumlu

26 Ekim 2016 Çarşamba

Özgür Web Teknolojileri Günleri 2016


Merhabalar,

Linux Kullanıcıları tarafından düzenlenen Özgür Web Günleri 2016, 22-23 Ekim'de Boğaziçi Üniversitesi Güney Kampüsü'ndeydi. Ben de etkinliğin 6.yılında yeniden katıldım. 

Özgür Web Teknolojileri Günleri Nedir?

  • Linux Kullanıcıları Derneği tarafından yılda bir kez düzenlenir.
  • Özgür web teknolojileri ile ilgilenen herkesin buluşma yeridir.
  • Toplumun her kesimine uygun düzeyde, tanıtıcı ve teknik seminerler yapılır.
  • Organizasyonlar, kamu kuruluşları ve özel sektörden ilgili şirketler stand açar, ürün ve hizmetlerini tanıtır.
Özgür yazılım ve web teknolojilerine ilgi duyanlar için oldukça doyurucu bir etkinlikti. Etkinlik programında dinlemek istediğim konular vardı.

Etkinliğin ilk günü sabahtan, "Özgür Web’e İntisap", "Laravel ile Modern Web Geliştirme", "Modern Web Uygulamalarında Özgür Teknolojiler", "Web Dünyasında Uluslararası Özgür Yazılım Fırsatları" seminerlerine katıldım.



Öğle arasında İstanbul'dan ve özgür yazılım camiasından yeni insanlarla tanışıp, keyifli sohbetlere dahil oldum. Henüz öğrenciyken sektörden birileriyle konuşup, öneri almak, kişilerle bağlantı kurmak benim için etkinliğin en yararlı taraflarından biri oldu. Öğleden sonrada dört farklı oturuma katıldım.


 Son 3 senedir katıldığım bu etkinlik bir şeyler keşfetmek, ufkumu genişletmek konusunda bana çok şey kattı. Dolu dolu geçen hafta sonumun yanında, Çanakkale'deyken göremediğim arkadaşlarımı görmek, etkinlikten sonra bile onlarla vakit geçirmek, evimde bir gece uyuyabilmek harikaydı :) (Şebnem Ferah konserini saymıyorum bile \m/). 


31 Temmuz 2016 Pazar

LibreOffice "headless" Modunda Dosyaları Dönüştürme

 

LibreOffice yazılımı komut satırından başlatarak, çeşitli parametreler atayabilirsiniz. Normal biçimde kullanımlarda, komut satırı parametrelerinin kullanımı gerekli değildir. Genellikle deneyimli kullanıcıların tercihidir.

UNIX-benzeri sistemlerde, LibreOffice yazılımını komut satırından başlatmak için aşağıdaki satır yazılır : 

${install}/program/soffice {parametre}}

Buradaki {install} ifadesini LibreOffice yazılımının kuruluş yoluyla değiştirin (örneğin, ~/office)

{parametre} ifadesi gerektiğinde geçerli komut satırı parametrelerinden biri yazılarak kullanılabiliyor. İşte bu parametrelerden biri olan "--headless" uygulamayı kullanıcı arayüzsüz kullanmanızı sağlar.

Diğer parametrelerden biri olan "--convert-to" ise dosyaları yığın olarak dönüştürebiliyor.

**Bu iki parametre birlikte kullandığında ise komut satırında, desteklenen tüm dosya formatlarını yığın olarak dönüştürebiliyor. 

Bunun için temel komut şudur;

soffice                                                             \
   -env:UserInstallation=file:///tmp/LibreOfficeConversion_${USER}" \
   --headless                                                       \
   --infilter=<filter>                                              \
   --convert-to <TargetFileExtension>:<NameOfFilter>                \
   --outdir /path/to/wherever/you/want                              \
     file_to_convert.xxx


-env:UserInstallation : bu parametre zaten potansiyel olarak çalışan bir GUI varsa çakışmasını engelleyecek ve farklı bir ortam kullanıp ek bir örnek sağlayacaktır.

<TargetFileExtension>  : Libreoffice tarafından desteklenen ve dışa aktarılabilen dosya formatları yazılabilir. Örneğin 'pdf', 'docx', 'xlsx'

<NameOfFilter>  : Önceki hedef dosya uzantısı yanı sıra girdi biçimi eşleşmelidir. Örneğin 'calc_pdf_Export', 'writer_pdf_Export'. Filtrelerin listesi şurada.

--infilter=<filter>  : parametresi isteğe bağlı olarak kullanılabilir. Eğer mümkünse girdi filtre türünü zorlar. Örneğin infilter="Calc Office Open XML"

  *.xcu dosyalarında ki girdi filtre isimleri şurada (API isimleri).  Örneğin MS_EXCEL_95.xcu dosyası şu satırı içerir :
                       
                    <node oor:name="MS Excel 95" oor:op="replace">


 
 

12 Temmuz 2016 Salı

.docx ve .odt nedir ?

 

   

 

.docx nedir?


 docx, Microsoft‘un Windows işletim sistemleri içerisinde yer verdiği Word yazılımının yeni nesil dosya uzantısıdır. Microsoft Word 2007 sürümüne kadar Word dosyalarının uzantıları “.doc” şeklinde kayıt edilirken Word’ün 2007 sürümü ve sonrasında kullanılan Word sürümlerinde dosya formatı “.docx” olarak oluşturulmaktadır.

 Belge verilerini tek bir binary dosyasında depolayan .doc dosyalarının aksine, .docx dosyaları Open XML formatı kullanarak oluşturulur, bu format da belgeleri sıkıştırılmış bir zip paketinde ayrı dosyalar ve klasörler olarak depolar.

 Bir .docx dosyasının içinde XML dosyaları ve üç klasör bulunur (docProps , word , ve _rels). Bu klasörler, belge özelliklerini, içeriğini ve dosyalar arasındaki ilişkileri tutar. Bu yapı, belgenin içeriğinin daha fazla erişilebilir olması için tasarlanmıştır.



 DOCX dosyasını açmak için bilgisayarınızda Microsoft Word 2007 veya daha sonraki sürümlerinin bulunması gerekiyor. Eğer bu sürümlerden daha önce yayınlanmış bir Word sürümü kullanıyorsanız DOCX dosyalarını açabilmek ve oluşturabilmek için Microsoft tarafından yayınlanmış olan uyumluluk paketini kurmanız gerekiyor.

 LibreOffice ve OpenOffice başta olmak üzere diğer ofis yazılımlarıyla veya DocX Viewer benzeri yazılımlarla da docx dosyalarını açabilirsiniz.




  .odt nedir? (Open Document Text)


 odt, LibreOffice Writer ve Google Belgeler gibi kelime işlem uygulamaları tarafından kullanılan dosya uzantısıdır.

 OpenDocument ya da tam adıyla OASIS OpenDocument XML biçimi, sayısal ortamda metin, hesap tablosu, çizim ve sunu gibi belgelerinizi saklamaya yarayan bir açık ve özgür belge standardıdır.

 İlk sürümü 3 Mayıs 2006 tarihinde kabul edilen OpenDocument biçimi, çok sayıda kelime işlemci ve ofis yazılımı tarafından desteklenmektedir. Bu belge biçimi LibreOffice, Apache OpenOffice, Calligra, Google Dokümanlar arayüzü, StarOffice ve Lotus Notes ürünleri tarafından da kullanılmaktadır.

 OpenOffice.org 2.0'dan itibaren tüm OpenOffice.org bileşenleri (Writer, Calc, Impress, vb) standart OASIS OpenDocument XML biçimini kullanmaya başladı. Bu sayede üreticiden bağımsız bir şekilde hazırlanan belgeler, herhangi bir editör yardımıyla açılıp incelenebilmektedir.

  Aslında birer XML belgeleri olan OpenDocument dosyaları, kayıpsız ZIP sıkıştırma algoritmasını desteklemektedir. Bir .odt dosyasının içinde XML dosyaları, diğer dosyalar(mimetype) ve iki dizin bulunur (META-INF, Thumbnails).


 *content.xml
   En önemli dosyadır. Belgenin gerçek içeriğini taşır. Temel HTML biçiminde esinlenilmiştir. İçeriği şöyledir:



*styles.xml
  Stil bilgilerini içerir. OpenDocument, biçimlendirme ve düzen için stilleri yoğun kullanır. Stillerin türleri vardır.
  • Paragraph styles
  • Page styles
  • Character styles
  • Frame styles
  • List styles

*meta.xml
    metadata dosya verilerini içerir. Örneğin; Author, "Last modified by", date of last modification. <dc:...> tagının ismi Dublin Core XML standarttan gelir. İçeriği şuna benzer:


*settings.xml
  Yakınlaştırma faktörü ve imleç konumu gibi ayarları içerir. Bunlar içerik veya düzen olmayan özelliklerdir. 

*mimetype (file)
  Belgenin tek satırlık dosyasıdır. Aslında bu dosya uzantısı biçiminin önemsiz olduğunun bir göstergesidir.. Dosya uzantısı orada sadece kullanıcı yararına bulunur.

*Thumbnails (directory)
  Küçük resim için ayrı bir dizindir. Küçük resmin, “thumbnail.png” olarak kaydedilmiş olması gerekir. Dosya kaydedildiğinde, belgenin küçük resim gösterimi varsayılan olarak oluşturulur.

  Belgenin temsili ilk sayfa, ilk tablo vs. olmalıdır. Küçük resimler için gerekli büyüklük 128x128 pixel'dir. Thumbnail Managing Standard (TMS) ına uygunluk sağlamak amacıyla, küçük resmin 8bit olarak kaydedilmiş olması gerekir.

*META-INF (directory)
  OpenDocument pakette yer alan dosyalar hakkında "manifest" adında bir XML dosyası saklanır. Manifest dosyası her zaman "META-INF/manifest.xml" yol adında depolanır. Manifestte saklanan bilgilerin ana parçaları:
  • Paketin içindeki tüm dosyaların bir listesi
  • Paketteki her dosyanın media tipi
  • Eğer paketin içinde saklanan bir dosya şifreli ise, dosyanın şifresini çözmek için gerekli bilgileri saklanır.

*Pictures (directory)
  Belgedeki görüntüler için ayrı bir dizin vardır. Bu dizin OpenDocument belirtimi içinde tanımlı değildir. Bu dizindeki eklenen dosyanın formatına göre, görüntü biçimlerini kullanabilirsiniz. Görüntü verileri rasgele bir biçime sahip olmakla birlikte, SVG ve PNG formatında saklanması tavsiye edilir.
  
 

15 Haziran 2016 Çarşamba

Linux Kernel İçin Yama Hazırlamak




Merhabalar, 

Geçen yıl, henüz 2.sınıftayken Linux Kernel için yamalar hazırladığım bir dönem olmuştu fakat bununla ilgili blog yazmayı atladığımı farkettim ve Türkçe kaynaklarında yetersiz olması sebebiyle kolları sıvadım :)

OPW isimli Gnome'un kadınlar için düzenlediği bir etkinlik var. Yılda iki defa düzenleniyor. Etkinliğin birçok katılımcısı bulunuyor (Linux Kernel, Gnome, Debian, Fedora, Mozilla gibi). Bende o dönemde Linux Kernel projeleri için hazırlandım. 

Linux Kernel projelerinden birine başvurmadan önce çekirdeğe yamalar yollamanız ve öngörülen sayıda yamalarınızın kabul edilmesi gerekiyor.
Opw Kernel sayfasında tüm yapılması gerekenler, okumak için önerilen birkaç kitap var. Burada da Greg Kroah-Hartman ilk yamanın nasıl yapılacağından bahsetmiş. 


Çok fazla kişinin sürekli aynı dosyalar üzerinde değişiklik yapıyor olması durumunda da daha gelişmiş bir biçimde sürüm takip sistemi kullanmam gerekti.
Git uzaktan birlikte çalışmak için oldukça yetenekli bir araç. Bu süreçte zaten bildiğim temel git kullanımının yanında, git'in daha fazla özelliğini kullanmam gerekti.


Temel olarak yama göndermeye kernel.org'dan aldığım çekirdek kodları dizini içerisindeki drivers/staging'den başladım. Çok temel kodlama biçimi düzeltmeleri yapabileceğimiz gibi, daha karmaşık düzeltmeler de yapabiliriz. 

Çalışmaya ilk başladığımda checkpatch.pl, sparse ve coccinelle araçlarını kullanmayı öğrendim. Bunlar statik ve en temel araçlardır. Başlangıç olarak Linux Kernel'a kodlama biçimi düzeltme dışında Sparse ve Coccinelle araçlarını kullanarak katkı verebiliriz. Bu araçlarla drivers/staging altındaki kodları derlediğimizde aldığımız uyarı mesajlarına göre düzeltmeler yapabiliriz.

Sparse aracı ile fonksiyon tiplerinin ya da değişken tiplerinin doğruluğu, gereksiz fonksiyonları kaldırma, tip dönüşüm işlemlerinin doğruluğu gibi uyarıları analiz edebiliriz.

Coccinelle, otomatik olarak analiz yapan ve C kodunu yeniden yazabilen bir araçtır. Kendine özel Smpl (Semantic Patch Languange) ile yazılan anlamsal betiklerden oluşmaktadır. Asıl yararı aynı düzeltmeleri her dosya için tek tek yapmak yerine, bir şablon oluşturup onunla birçok dosyayı tek seferde tarayayıp değiştirebilmesidir.

Yama gönderirken zorlandığım yanlardan birisi de, Linux Kernel ekibi kodlama biçimine oldukça önem veriyor. Bu yüzden aynı yamayı defalarca yeniden sürümlediğim zamanlar oldu. Hatta kodlama biçimini test etmek için yazdıkları bir Perl betiği de var. (Kodlama biçimi düzeltme yamalarını gönderebilmek için bu betiği kullanmalıyız.) 

Hazırlandığım süre boyunca git kullanımı, çekirdek ve derleme hakkında çok şey öğrendim. Teknik bilgiler dışında asıl kazandığım büyük deneyimin, uzaktan yabancı birileri ile çalışmak olduğunu düşünüyorum. 

Yazının geri kalanında bu işin biraz teknik kısmından bahsedeceğim.


Kernel'ı Derleme 

$ sudo apt-get install vim libncurses5-dev gcc make git exuberant-
ctags


$ mkdir -p git/kernels; cd git/kernels

$ git clone -b staging-next
git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging.git


$ cp /boot/config-`uname -r`* .config

$ make -jX

$ sudo make modules_install install

* Bu adımlardan sonra bir takım grub ayarlarını yapmamız gerekiyor.

$ sudo vim /etc/default/grub komutu ile dosya içeriğini açarak, gerekli düzenlemeyi yapıyoruz.
   
  GRUB_HIDDEN_TIMEOUT=0
  GRUB_HIDDEN_TIMEOUT_QUIET=true
  GRUB_TIMEOUT=10 
 
Düzenleme işlemi bitince çalıştırmamız gereken komut ise: 

$ sudo update-grub2

E-mail Ayarları

Linux kernel için yama göndermek istiyorsak, bazı e-mail ayarlarını düzenlemeye ihtiyacımız var.

$ sudo apt-get install git-email

$ vim .gitconfig 


[user]
   name = Your Name
   email = your.email@example.com 

Git ile Yama Hazırlarken Kullandığım Temel Komutlar

$ git add . 

$ git commit -m “İlk commit”

$ git branch -a

$ git checkout -b ilk-yama

İlk Yamayı Göndermek 

$ git diff

$ git add <degisiklik_yapilan_dosya>

$ git commit -s -v 

$ git send-email --annotate HEAD^

Sonraki Yamalar İçin

 *Depo Güncelleme:
     
      $ git fetch staging
      $ git checkout -b staging-fixes-rebase
      $ git rebase staging/staging-next
  
 *Versiyonlama:

      $ git format-patch –subject-prefix="PATCHv2"

  *Eski commitleri görüntülemek
      
      $ git log

 *Commitleri Birleştirmek:
    
     $ git rebase -i commit_id

Sonraki yazımda görüşmek üzere :)