22 Ekim 2017 Pazar

LibreOffice, Libreoffice Online Derleme ve Yama Gönderme Süreci



    Libreoffice bir masaüstü ofis paketidir. Yıllar boyunca farklı adlarda geliştirilmiş şu an ise  Libreoffice adıyla devam etmektedir. Libreoffice Online ise halihazırda olan Libreoffice çatısı altındaki masaüstü uygulamaların tarayıcı üzerinde çalışan halidir. Bununla birlikte Libreoffice yüklemeksizin tüm cihazlar tarayıcı ile Libreoffice uygulamalarını kullanabilecek hale gelmesi hedeflenmiştir.

LibreOffice çekirdeğini derlemek


Derleme sürecinde işletim sisteminden işletim sistemine farklı paketler eksik çıkabiliyor bunları kurmanız gerekebilir. Önce temel bağımlılıkları kuralım:
 $ sudo apt-get build-dep libreoffice
 $ sudo apt-get install git libkrb5-dev libjpeg-turbo8-dev doxygen graphviz 

Ben çekirdek ve online'ı ayırmak ve daha düzenli tutmak için her ikisini de libreoffice adlı bir klasörün altında tutuyorum. Bunun için önce libreoffice klasörü oluşturalım ve içerisine girelim:

 $ mkdir libreoffice  
 $ cd libreoffice  

Şimdi ise libreoffice core'u yerelimize çekelim:

 $ git clone git://anongit.freedesktop.org/libreoffice/core  

sonrasında dizine girelim ve derleme süreci öncesi gerekli işlemleri yapalım:

 $ cd core  
 $ ./autogen.sh  

Derleme işlemini başlatalım:

 $ make  

Bu işlem bir hayli uzun sürecek. Sorunsuz bir şekilde bittiğini varsayarsak artık şu komutlarla libreoffice'in ürünlerini test edebiliriz:

 $ instdir/program/soffice --writer  
 $ instdir/program/soffice --calc  

Şu
sayfada bu işlemleri daha ayrıntılı bir şekilde bulmak mümkün.

LibreOffice Online derlemek

Öncelikle core klasöründen çıkıp bir üst dizin olan libreoffice klasörümüze geri dönelim ve online deposunu yerelimize çekelim:
 $ cd ..  
 $ git clone https://github.com/LibreOffice/online.git  
 $ cd online  

LibreOffice iki temel bileşender oluşuyor. loolwsd ve loleaflet
Öncelikle Web Services Daemon(wsd)'yi derleyelim.

loolwsd'i derlemek

Şu bağımlılıkları var:
* libpng
* poco kütühanesi: http://pocoproject.org/index.html
* libcap-progs
Bunlara ek olarak farklı işletim sistemlerinde farklı bağımlılıklar olmayabilir. Onları da elle yüklemek gerekebilir. Şu komutla temel bağımlılıkları kuralım:

 $ sudo apt-get install libcap-dev libpng12-dev libtool m4 automake  

Poco depoda da var ama ben kendim derlemeyi tercih ettim. Depodan kurduğum versiyonda "Segmentation fault" hatası aldığım için. İllaki depodan kuracaksanız:

 $ deb https://www.collaboraoffice.com/apt-poco/ /  
 $ sudo apt-get update  
 $ sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 0C54D189F4BA284D  
 $ sudo apt-get update  
 $ sudo apt-get install libpoco-dev  

Poco'yu yüklemeyi bir türlü halletiğinizi düşünerek işlemlere devam edelim.

Sırasıyla şu komutları çalıştıralım:

 $ libtoolize  
 $ aclocal  
 $ automake --add-missing  
 $ autoreconf  
 $ autoheader  

Şimdi derleme öncesi ayar kısmına geldik.

 $ ./configure --enable-silent-rules --with-lokit-path=/home/ozturkemre/libreoffice/core/include --with-lo-path=/home/ozturkemre/libreoffice/core/instdir --enable-debug  

Buradaki lokit-path ve lo-path daha önce derlediğimiz core parçasının içeriği. Sizde yerelinizdeki ile değiştirin. Eğer siz de poco 'yu elle derlemişseniz burada bunun konumundan da bahsetmemiz gerekecek.
--with-poco-includes=<POCO_dizini>/include ve --with-poco-libs=<POCO_dizini>/lib parametrelerini configure komutuna eklemeliyiz.

Geldik derleme kısmına:

 $ make  

loolwsd ile ilgili ayrıntılı anlatımı şu adresten bulabilirsiniz.

Geldik leaflet platformuna.

loleaflet'i derlemek

Öncelikle loleaflet dizinine girelim:
 $ cd loleaflet  

npm yüklü değilse kuralım.

 $ sudo apt-get install npm nodejs  

npm ile bağımlılıkları yükleyelim.

 $ npm install -g jake  

npm en az 3.x sürümünde olmalı. Kontrol edelim

 $ npm -v  

Değilse güncelleyelim.

 $ npm install -g npm  

makefile dosyası node diye aradığından sembolik link oluşturalım.

 $ sudo ln -s /usr/bin/nodejs /usr/bin/node  

Şimdi derlemeye hazırız.

 $ make  

Derlemeden sonra bir önceki dizine dönelim ve çalıştıralım:

 $ cd ..  
 $ ./loolwsd --o:sys_template_path=systemplate --o:lo_template_path=/home/ozturkemre/libreoffice/core/instdir --o:child_root_path=jails --o:storage.filesystem[@allow]=true  

Ve konsolun bize söyledği adrese tarayıcımızla girdiğimizde dosyamızı göreceğiz.

leaflet ile ayrıntılı bilgiyi buradan bulabilirsiniz.

Yamamızı Gerrit'e gönderme

Libreoffice web tabanlı olan Gerrit kod işbirlikçisini kullanılıyor. Öncelikle geliştiriciler sayfasını düzenleyerek kendimizi bu sayfaya eklememiz gerekiyor. Bu sayfadaki lisans kısmını doldurabilmek için libreoffice@lists.freedesktop.org adresine geçmiş ve gelecekteki tüm katkılarımızın MPLv2/LGPLv3+ lisans çifti ile lisanslanabileceğini belirten bir mail atmamız gerekiyor.

Konu kısmı şu şekilde olmalı:
<isminiz> license statement

mail içeriği ise şu şekilde olmalı:

 All of my past & future contributions to LibreOffice may be
   licensed under the MPLv2/LGPLv3+ dual license.


Maili attıktan sonra geliştiricilerin olduğu sayfasına geri dönelim. Burada geliştiriciler soyisim, isim sırası ile tutuluyorlar. Soyisminizin başladığı harf bloğuna şu şekilde ekleme yapabilirsiniz:

O
-------------------------------------------------------------
.
.
.
|-
| documentfoundation wikisindeki kullanıcı adınız
| Soyisim, İsim
| {{nospam|git email adresiniz}}
| IRC nickiniz
| Individual
| [Attığınız lisans mailinin adresi]
|-
.
.
.

Lisans mailinizi şu adresten bulunduğunuz ayın thread sayfasında bulabilirsiniz.
Örneğin: https://lists.freedesktop.org/archives/libreoffice/2017-October/078596.html

Gerrit ayarlarının yapılması

Önce bir gerrit hesabı açalım.
Bu adresten Register kısmına tıklayarak birden farklı yolla kayıt olabiliriz. Sonrasında giriş yapalım ve sağ üstten adımıza tıklayarak Settings kısmını açalım. Burada "SSH Public Keys" kısmını doldurmamız gerekecek.

Bunun için öncelikle bir anahtar çifti oluşturalım. Bunu ana dizinizimdeki(core) logerrit uygulaması sayesinde yapacağız.

 $ ./logerrit setup  

komutu sonrası "/home/[kullanici_adimiz]/.ssh/id_rsa.pub" dosyasının içeriğini SSH Public Keys sayfasındaki Add Key butonuna basarak ekleyelim.

 $ ./logerrit test   

komutu sorunsuz bir şekilde çalıştıysa tamam demektir.

Libreoffice wiki sayfasında belirtilen şu Easy Hacks sayfasından başlamak başlangıç için iyi bir tercih olacaktır.

Yamamızı bitirdiğimizi düşünürsek şimdi gelelim bunu gönderme kısmına.

 $ git checkout -b <yeni_dal_adi>  

ile yeni bir dal oluşturup o dala geçtik. Şimdi dosyalarımızı ekleyelim.

 $ git add dosya_adi  

Gelelim commit işlemine. Commit mesajımızda bug numarasını eşleştirmemiz lazım. Bu işlemi commit mesajının başına "tdf#<bug_id>" ekleyerek yapacağız.

 $ git commit  

Şimdi commit'imizin bir change id'si olmalı.

Buradan sonrasında yazımı online ve core olarak ikiye ayırıyorum.

Core için

commit-msg dosyamız çalıştırılabilir olmalı.
 $ chmod u+x ~/libreoffice/core/.git/hooks/commit-msg  

Sonrasında şu komutla change-id miz oluşturulsun.

 $ curl -Lo ~/libreoffice/core/.git/hooks/commit-msg https://gerrit.libreoffice.org/tools/hooks/commit-msg  

Şimdi de bu commit'imizi gerrit deposuna gönderelim:

 $ ./logerrit submit master  

Online için

commit-msg dosyamızı çalıştırılabilir yapalım.
 $ chmod u+x ~/libreoffice/online/.git/hooks/commit-msg  

Change-id mizi oluşturalım.

 $ curl -Lo ~/libreoffice/online/.git/hooks/commit-msg https://gerrit.libreoffice.org/tools/hooks/commit-msg  

Commit'imizi gerrit deposuna gönderelim:

 $ git push ssh://logerrit/online HEAD:refs/for/master  

Gerrit sayfasında commit'imizi görebiliriz.

Böylece LibreOffice, Libreoffice Online derleme ve yama gönderme sürecini öğrendik.

İyi çalışmalar.

7 Ağustos 2017 Pazartesi

Loglama ve log4j

Loglama kavramı nedir?

 Bir sistemin çalışma zamanında durumunu saklama durumuna denir. Sistemde yaşanılan hatalar yada yapılan işleri incelemede kullanılabilir. Logların kullanışlı olması anlaşır olmasına ve loglanma görünümüne bağlıdır. Anlaşılabilir bir log debug, bakım ve geçmişi kontrol etme gibi konularda sistem yöneticisi veya programcıya yardımcı olur.


Log4j nedir?

Apache Yazılım Lisansı altında dağıtılan, Java ile yazılmış hızlı, güvenilir ve esnek bir API'dir. Java'da yazılmasına rağmen C, C++, Python, Perl gibi popüler dillerde de kullanılır.


Yapılandırma

log4j log4j.properties dosyasından kolayca yapılandırılabilir. Bu yapılandırma dosyası şu şekildedir.


# Root logger option
log4j.rootLogger=INFO, file, stdout

# Direct log messages to a log file
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.File=C:\\ProjectHome\logging.log
log4j.appender.file.MaxFileSize=10MB
log4j.appender.file.MaxBackupIndex=10
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n

# Direct log messages to stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n

Buna ek olarak istenildiği durumda xml formatında da bu ayarlamalar yapılabilir.

Hadi buradaki bazı satırları açıklığa kavuşturalım.

rootLogger satırında INFO log seviyesini belirtir. file ve stdout ise log dosyalarının nereye yazdırılacağını belirtir ki örneğimizde bu bir dosya(file) ve standart çıktı(stdout).

appender komutu ile logun ekleneceği seçeneği belirtir. File ekiyle çıktının konumunu belirtiriz. İstersek bir çevresel değişken tanımlayıp burada kullanabiliriz. ConversionPattern ile dosyamıza çıktımızın hangi düzende basılacağını ayarlıyoruz.

Devamında ise benzer komutları standart çıktı için ayarlıyoruz.

Log seviyeleri şu şekildedir.
ALL > DEBUG > INFO > WARN > ERROR > FATAL

Burada büyükten küçüğe doğru gittikçe kapsam azalır. Loglama yaparken seviyelere dikkat etmek önemlidir. Kullanıcının görmemesi veya görmesine gerek olmayan logları onlara göstermemek gerekir. Sistemi incelemek durumunda log modu değiştirilebilir ve o mod ve altında kapsadığı modlarda basılan loglar incelenebilir. 



import org.apache.log4j.Logger;

public class log4jDeneme {

  final static Logger logger = Logger.getLogger(log4jDeneme.class);

  public static void main(String[] args) {
        logger.debug("debug log message");
        logger.info("info log message");
        logger.warn("warn log message");
        logger.error("error log message");
 
 }

}

log4j.properties dosyasındaki ayarlarımızdaki info seviyesine göre kodumuzu çalıştırdığımızı düşünürsek, info,warn ve error logları basılırken debug basılmayacak. Eğer debug seviyesine geçersek bu da basılacak. Debug moda geçmek için log4j.properties dosyasındaki info yu debug yapmak yeterli olacak.

Temel seviyede bahsedeceklerim bu kadar. Yardımcı olması dileğiyle.
İyi günler.

1 Ağustos 2017 Salı

GIT ve TFVC


TFS nedir?

Microsoft tarafından 2006 yılında yayınlanan planlama, kodlama, test etme vb. yazılım geliştirme yönleriyle ilgilenen bir uygulama yaşam döngüsüdür. TFVC ise TFS'nin sunduğu bir versiyon kontrol sistemidir.


Git nedir?

Linux çekirdeğini geliştiren topluluğun BitKeeper'ın geliştiricileri ile aralarının bozulması sonucu Linus Torvalds 'ın liderlik ettiği bir topluluk tarafından 2005 yılında geliştirilmeye başlayan bir versiyon kontrol sistemidir.


İki farklı ürününde versiyon kontrol sistemlerin olarak birbirlerine göre eksi ve artıları vardır.  Şimdi bunları inceleyelim.

Farklılıklar


Erişilebilirlik

TFVC çevrimdışı erişmeye izin vermez. İnternet bağlantınızın kesilmesi veya serverın çökmesi durumunda dosyaları kontrol edemez ve değiştiremezsiniz. GIT bunu destekler.

Ek özellikler

TFVC otomatik yapılar, testler, analitik ve grafik çizim, manuel test izleme gibi birçok ek özelliğe destek verirken GIT bu özelliklerin hiçbirini destek vermez.
Aynı zamanda TFVC Microsoft'un çoğu ürünü ile ilişki içindedir.


Çalışma ortamı

TFVC dosyaları izlemek ve sürümlemek için tek ve merkezi bir depo kullanır. TFVC de yerel olarak yapılan bir değişiklik genellikle merkezi sunucuda da yapılır ve diğer kullanıcılar bu değişiklikleri alabilir.
GIT ise bir dosyayı yerel olarak izleme, sürümleme gibi hizmetler verir. Kullanıcılar yapılan değişikleri push ve pull ile birbiriyle paylaşır.

TFVC dosya sistemi temel yapısında çalışır.
GIT değişiklik temel yapısında çalışır.


Maliyet

Çeşitli kaynaklardan dallanma TFVC'de çok maliyetli ve yüklü bir işken GIT'de bu çok hızlı ve hafifdir.

TFVC lisans ücreti gerektirir ve sadece Microsoft tarafından geliştirilir. GIT ücretsizdir, şuan itibariyle 1107 kişinin katkısıyla geliştirilmeye devam etmekte olup kaynak kodu açık bir sistemdir.


Branch yapısı

TFVC'de bir branch geliştirilmesi, kullanıcının dizininin komple bir kopyasını almasına anlamına gelirken GIT'de sadece referans ile farklılıklar tutulur.

TFVC birbiriyle ilişkili olmayan dalların birleşmesine izin vermezken GIT bu izni verir.


Bu arada TFS, TFVC nin yanında artık Git versiyon kontrol sistemine de destek veriyor. Karar size kalmış.

İyi günler.

31 Temmuz 2017 Pazartesi

Angular translate ile çoklu dil desteği olan sayfalar

Bir web sayfası oluşturduğunuzu düşünün. Zaman geçti ve hedef kitlenizi değiştirmek istiyorsunuz. Sayfanıza İngilizce desteği eklemek istiyorsunuz. Eskiden bu durumda her sayfanın bir adet kopyasını yapmamız gerekirdi. Bir de İspanyolca, İtalyanca desteğini de eklediğimizi varsayalım. Tüm dillerle beraber toplam sayfa sayımız katlandıkça katlandı. Şuan bile bu işlem çok zor iken sayfaların sayısı ve içeriği arttıkça bu süreç imkansızlaşacak. Dinamik web sayfalarıyla beraber bu soruna birçok çözüm getirildi. Bu çözümlerden biri de Angular-translate. Angular-translate ile birlikte sayfalar arasında anlık olarak dil değiştirebilecek ve yüzlerce sayfadan kurtulacağız. 

Bu yazımda bir html dosyasında basitçe bir Angular translate işlemi nasıl uygulanır ondan bahsedeceğim. 

Gereksinimler 

  • Bower


Şu şekilde angular-translate i yükleyelim.

bower install angular-translate

Html dosyamızın içeriğinin bu şekilde olduğunu düşünelim. 


<!DOCTYPE html>
<html>
<body>
<div>
<h1> <span style="color:grey">selam</span></h1>
<div>
<br>
<button>English</button>
<button>Turkce</button>
 </div>
</div>
</body>
</html>

Şuan bizim iki butonumuz var. Biz istiyoruz ki butonlara basınca sayfamızın içeriği değişsin. 

Şimdi bu html dosyamıza bir kaç düzenleme yapalım.

Öncelikle <html> tagini <html ng-app="myApp"> olarak değiştirelim ve böylece bir angularjs uygulaması haline dönüştürelim.

Şimdi bulunduğumuz dizinde bir app.js dosyası oluşturalım.

içeriği şu şekilde başlasın.


var app = angular.module("myApp",['pascalprecht.translate']);

Bu şekilde uygulamamızı tanımladık, parametre olarak html dosyamızdaki myApp'ı ve translate modülünü eklemiş olduk.


Hemen peşine şunu ekleyelim.

app.config(["$translateProvider",function($translateProvider){
  
  var en_translations = {
    selam : "Hello World"
  }
  
  var tr_translations = {
    selam : "Merhaba Dunya"
  }
  $translateProvider.translations('en',en_translations);
  
  $translateProvider.translations('tr',tr_translations);
  
  $translateProvider.preferredLanguage('tr');
  
}]);


Burada iki farklı dil seçeneği ekledik. Bunları iki farklı json dosyası gibi düşünelim. Html dosyamızdaki selam yazımız iki farklı dile göre farklı çıktılar sunacak. preferredLanguage kısmında ise tr ayarladık. Böylece varsayılan olarak sayfa yüklenince tr dili ile yüklenecek. 


Bir <head></head> etiketi oluşturalım ve içine az önce bower ile indirdiğimiz angular kütüphanesini ve oluşturduğumuz app.js dosyalarını kaynak olarak gösterelim.

<script src="bower_components/angular/angular.js"></script>
<script src="bower_components/angular-translate/angular-translate.js"></script>
<script src="app.js"></script>


Geldik <body> kısmına. Burada ilk <div> etiketini Controller yapalım.

<div ng-controller="MainController"> 

Geldik hemen sonrasındaki <span> etiketine. Burada ufacık bir değişiklik yapalım. <span> etiketini <span translate> yapalım ve şu şekilde görünsün. 

<h1> <span translate style="color:grey">selam</span></h1>

Button kısmında da şöyle bir değişiklik yapalım;

<button ng-click="changeLanguage('en')">English</button>
<button ng-click="changeLanguage('tr')">Turkce</button>

Birazdan buradaki ng-click ne işe yaradığından bahsedeceğim.
Şimdi geldik Controller kısmına.

Aynı dizinde MainController.js adında bir dosya oluşturalım ve içerisini şu şekilde dolduralım.

app.controller("MainController" ,["$scope","$translate",function($scope,$translate){
  $scope.changeLanguage = function(lang){
   $translate.use(lang); 
  }
  
}]);

İşte bu da Controller yapımız. Artık html dosyamızın içindeki butona basınca ng-click bu controllerımızı tetikleyecek. Controller ise bu işlem için config dosyamızdaki ayarları uygulayacak üstelik bunların hepsi dinamik bir sayfada hızlı bir şekilde gerçekleşecek.
Olur da Angular için bir stil rehber ararsanız bu adresi tavsiye ederim. Güzel ve açıklayıcı olmasının yanında çoklu dil desteği de var. 😏

İyi günler.


HelloWorld.html 


<!DOCTYPE html>
<html ng-app="myApp">
<head>
<script src="bower_components/angular/angular.js"></script>
<script src="bower_components/angular-translate/angular-translate.js"></script>
<script src="js/app.js"></script>
<script src="js/controllers/MainController.js"></script>
</head>
<body>
<div ng-controller="MainController">
<h1> <span translate style="color:grey">selam</span></h1>
<div>
<br>
<button ng-click="changeLanguage('en')">English</button>
<button ng-click="changeLanguage('tr')">Turkce</button>
 </div>
</div>
</body>
</html>




app.js

var app = angular.module("myApp",['pascalprecht.translate']);
app.config(["$translateProvider",function($translateProvider){
  
  var en_translations = {
    selam : "Hello World"
  }
  
  var tr_translations = {
    selam : "Merhaba Dunya"
  }
  $translateProvider.translations('en',en_translations);
  
  $translateProvider.translations('tr',tr_translations);
  
  $translateProvider.preferredLanguage('tr');
  
}]);




MainController.js

app.controller("MainController" ,["$scope","$translate",function($scope,$translate){
  $scope.changeLanguage = function(lang){
   $translate.use(lang); 
  }
  
}]);

27 Temmuz 2017 Perşembe

Maven nedir ve nasıl kullanılır ?

Maven nedir?


Maven ; proje adımlarını basitleştirmek, etkili bir belgelemelendirme ve bağımlılıkları ortadan kaldırmaya yarayan bir Java geliştirme aracıdır. 

Kurulumu oldukça kolaydır. Proje kalıpları standart haline getirilmiştir  ve böylece tüm IDE'ler destek vermektedir.


Projedeki tüm bağımlılıklar POM adı verilen bir xml dosyası altında toplanmıştır. Bu dosyaya yazılan kütüphaneler eğer yerel depomuzda yoksa ilgili Maven depolarından indirilir. 

Gereksinimler 

  • JDK 1.7+


Kurulum


Maven dosyalarını şu adresten indirelim.

JAVA_HOME çevresel değişkeninin bu komutu çalıştırarak JDK 'yı gösterdiğine emin olalım.


echo $JAVA_HOME
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.141-1.b16.el7_3.x86_64/

İndirdiğiniz dosya formatına göre aşağıdaki komutlardan birini çalıştırınız. 


unzip apache-maven-3.5.0-bin.zip
tar xzvf apache-maven-3.5.0-bin.tar.gz

Oluşan apache-maven-3.5.0 dizinindeki bin dosyasını PATH çevresel değişkenine ekleyelim ki maven dizinimiz işletim sistemi tarafından bilinsin.



export M2_HOME=/usr/local/apache-maven/apache-maven-3.3.9 
export M2=$M2_HOME/bin 
export PATH=$M2:$PATH

sonrasında şu komutla kurulumu onaylayın.



mvn -v

çıktımız buna benzer bir şey olacak. 



Apache Maven 3.5.0 (ff8f5e7444045639af65f6095c62210b5713f426; 2017-04-03T19:39:06Z)
Maven home: /home/emre/apache-maven-3.5.0 
Java version: 1.8.0_141, vendor: Oracle Corporation 
Java home: /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.141-1.b16.el7_3.x86_64/jre 
Default locale: en_US, platform encoding: UTF-8 
OS name: "linux", version: "3.10.0-514.26.2.el7.x86_64", arch: "amd64", family: "unix"

Proje oluşturma
Aşağıdaki komutla örnek bir proje oluşturalım.

mvn archetype:generate -DgroupId=com.mycompany.app -DartifactId=my-app -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

komutuyla örnek bir proje oluşturabilirsiniz. İlk kurulum olduğu için biraz vakit alacak çünkü Maven bazı temel şeyleri yerel depomuza indirecek.

Az önce -DartifactId e atadığımız değerle aynı klasör oluştu(my-app). 



my-app/
 ├── pom.xml
 └── src
     ├── main
     │   └── java
     │       └── com
     │           └── mycompany
     │               └── app 
     │                   └── App.java 
     └── test 
         └── java 
             └── com 
                 └── mycompany 
                     └── app 
                         └── AppTest.java

my-app/src/main/java dizini projenin kaynak kodunu,
my-app/test/java ise test kodunu içeriyor.

Ve bir de pom.xml dosyamız var. Bu dosya da Proje nesne modeli(Project Object Model) anlamına geliyor. Projenin ayarlarını içeren geniş bir dosya.



<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion> 
  <groupId>com.mycompany.app</groupId>
  <artifactId>my-app</artifactId>
  <packaging>jar</packaging>
  <version>1.0-SNAPSHOT</version>
  <name>my-app</name>
  <url>http://maven.apache.org</url>
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
</project>

Bu ise az önce oluşturduğumuz, Maven'in bize sunduğu basit bir prototip, archetype:generate. 

<project> : Maven'in hangi versiyonlarının kullanılacağının belirtildiği kısım. 
<modelVersion> : POM model versiyonu.
<groupId> : Projenin ait olduğu grup veya kuruluş. 
<artifactId> : Projenin kitaplık eserine (JAR ve WAR dosyasının adı) verilecek ad
<version> : Yapım aşamasındaki projemizin versiyonu.
<packaging> : Projenin hangi formatda paketlenmesi gerektiğini belirtir. Varsayılan JAR'dır. WAR paketleme için değeri war dır.
<url>: Projemizi deploy etmek istediğimizde kullanılacak adres.
<dependencies> : Projemizde kullanmak istediğimiz tüm bağımlıkların eklendiği kısım. 
<scope> : Projenin hangi yapılandırmayı kullanacağının belirtildiği kısım.

Projeyi kurmaProjemizi oluşturduk. Şimdi bunu kurulabilir(çalıştırılabilir) bir paket dosyası haline getirelim.



mvn package
Bu komut sonrasında pom.xml de belirtilen dosyalar indiriliyor ve bir jar dosyası olarak paketleniyor. 

Çıktı şu şekilde sona eriyor.



[INFO] BUILD SUCCESS 
[INFO] ------------------------------------------------------------------------ 
[INFO] Total time: 16.272 s [INFO] Finished at: 2017-07-26T14:40:54Z
[INFO] Final Memory: 17M/41M 
[INFO] ------------------------------------------------------------------------

Şimdi jar paketinin test edebilim.



java -cp target/my-app-1.0-SNAPSHOT.jar com.mycompany.app.App

çıktımız ;



Hello World!


Yukarıda kullandığımız mvn package komutundaki package gibi komutlara lifecycle diyoruz. 

İşte bunlardan bazıları ;

clean: Proje derlendikten sonra oluşan target klasörünü siler.

validate: Projede herhangi bir hata olup olmadığını doğrular.
compile: Clean in yaptığı işi yapar, hatalı kısımları tarar ve derleme işlemi yapar.
test: Derlenmiş kaynak kodunu test eder.
package: projeyi test eder ve paketler. 
integration-test: gerektiğinde paketi entegrasyon testlerinin yürütülebileceği bir ortama işlemek ve dağıtmaya yarar.
verify: projenin paketlenmesini tamamlar ve bunların doğruluğunu onaylar.
install: paketi yerel depoya yükler.
deploy: projeyi sunucuya deploy etme işini yapar.

İşte böylece basit bir Maven projesi oluşturmuş ve bununla ilgili temel düzeyde bir şeyler öğrenmiş olduk.

İyi günler.

20 Temmuz 2017 Perşembe

Örnek bir Spring Boot Uygulaması


Daha öncesinde Spring ve Spring Boot nedir onun hakkında yazmıştım.
Bu yazımda beraber basit bir Spring Boot uygulaması oluşturturacağız.

Projemizin dosya yapısı şu şekilde;

proje_adi
    └── src
        └── main
            └── java
                └── hello
                    └──Application.java
                    └──HelloController.java
    └──target
    └──pom.xml


Gereksinimler ;

  • JDK 1.8+
  • Maven 3.0+



Maven ; proje adımlarını basitleştirmek, etkili bir dökümantasyon oluşturmak ve bağımlılıkları ortadan kaldırmaya yarayan bir araçtır.

Eğer daha önce Maven kullanmadıysanız buradan bilgi edinebilirsiniz.

Dosya yapısını oluşturma 


Projemizin ana dizininde şu komutu çalıştırarak alt dizin oluşturalım.

mkdir -p src/main/java/hello

Şimdi projemizin ana dizininde pom.xml dosyası oluşturmalıyız.

pom.xml şu şekilde olmalı:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <artifactId>spring-boot-deneme</artifactId>
    <version>0.1.0</version>
    <name>spring-boot-deneme</name>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.2.RELEASE</version>
    </parent>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>

    <properties>
        <java.version>1.8</java.version>
    </properties>


    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

Şimdi basit bir web uygulaması oluşturalım.

src/main/java/hello/HelloController.java dosyası da şu şekilde olmalı:

package hello;

import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.RequestMapping;

@RestController
public class HelloController {

    @RequestMapping("/")
    public String index() {
        return "Spring Boot Merhaba Dünya";
    }



}

@RestController bayrağı o sınıfın Spring MVC tarafından web istekleriyle ilgilenmek için hazır olduğunu belirtir.
@RequestMapping ise "/" a gelen istekleri index() methoduna eşler. 
Böylece "http://localhost:8080/" sayfasına gelen isteklerde bu servis çalışacak.


Sırada Application sınıfımız var.

src/main/java/hello/Application.java dosyamız da şu şekilde olmalı.

package hello;

import java.util.Arrays;

import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;

@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

    @Bean
    public CommandLineRunner commandLineRunner(ApplicationContext ctx) {
        return args -> {

            System.out.println("Let's inspect the beans provided by Spring Boot:");

            String[] beanNames = ctx.getBeanDefinitionNames();
            Arrays.sort(beanNames);
            for (String beanName : beanNames) {
                System.out.println(beanName);
            }

        };
    }

}
Şimdi geldik uygulamayı çalıştırmaya;

Öncelikle bir maven paket dosyası oluşturmamış lazım.
Şu komutla target klasörünün altında bir java dosyası oluşturulur ve devamında da bunu çalıştıralım.

mvn package && java -jar target/spring-boot-deneme-0.1.0.jar


Sonrasında http://localhost:8080 adresine girelim. Tebrikler ilk Spring Boot uygulamanızı oluşturdunuz.

Sonrasında Control+c ile bağlantımızı kesebiliriz.

Daha fazlası için bu adrese başvurabilirsiniz.
İyi günler


LibreOffice, Libreoffice Online Derleme ve Yama Gönderme Süreci

    Libreoffice bir masaüstü ofis paketidir. Yıllar boyunca farklı adlarda geliştirilmiş şu an ise  Libreoffice adıyla devam etmektedir. Lib...