17 Eylül 2016 Cumartesi

ODC İş Çözümleri Yaz Stajı

Herkese merhaba, ikinci stajımı bu yaz ODC'de yaptım ve bu süre içerisinde kazanmış olduğum deneyimlerimi paylaşmak istedim.

Stajım iki ay sürdü. İlk ayda Swagger üzerine çalıştım. Bir rest apinin nasıl Swagger uyumlu hale getirileceğini öğrendim. Diğer Swagger araçlarını (Swagger Codegen, Swagger UI, Swagger Core ) da öğrenip üzerinde çalıştığım projede uyguladım. Swagger çalışmalarıma ek olarak ilk ayda Bootstrap öğrendim. Uygulama olarak Bootstrap ile bir form oluşturdum, bu formdaki girilen bilgileri bir servise gönderdim. İkinci ayda ise JUnit üzerine çalışmalar yaptım. 1 ay boyunca birim test ile ilgilenmem çok faydalı oldu benim için. Büyük çaplı projelerdeki birim testin önemini anlamış oldum. Nelerin test edilmesi gerektiğini, hangi amaçla test edildiğini öğrenmiş oldum.

Staj maceramın :) neler yaptım kısmı böyleydi. Şimdi duygu ve düşüncelere geçmek istiyorum.

Staj çıkışında metrobüste eve dönerken; akşama hangi konulara bakmam gerektiğini ve o gün neler öğrendiğimi düşündüğümde doğru yolda olduğumu anladım :) Tam bunu anladığımda Eluveitie - Vianna şarkısı çalıyordu. Beni motive eden parçalardan birisidir dayanamadım sizle de paylaştım.

Kavacık ciddi anlamda çok güzel e-si-yor-du :) Öğle aralarımız çok eğlenceli geçiyordu.

Stajda aklıma gelen her soruyu sorduğumda göstermiş oldukları sabırdan dolayı :) +Serdar Yiğit +ibrahim halil altun , Sinan Dirlik ve Nevra Aşuk'a çok teşekkür ederim. Bana yapmış olduğunuz bütün tavsiyeleri ve uyarıları dikkate aldım. Çok güzel zamanlardı benim için özlüyor insan :( İlk defa bir yazımda bu kadar duygusal cümleler kuruyorum :)

Stajda olduğum süre içerisinde bana yardımcı olan herkese ve ODC'ye teşekkür etmek istiyorum.


Son olarak stajımla ilgili sevdiğim sloganım "More than an Internship :) "

16 Ağustos 2016 Salı

Birim Test ve JUnit Kullanımı

Herkese merhaba, bu yazımda Birim Test ve Java'nın bir kütüphanesi olan JUnit'den bahsedeceğim. Yazının içeriğine alt başlıklar halinde şöyle bir bakacak olursak;

Birim Test nedir?
Yazılım Projesinde Birim Test'in Önemi nedir?
JUnit nedir? - Junit'de kullanılan assertion / annotation kavramları nelerdir?
Eclips'de JUnit oluşturulması ve çalıştırılması nasıl olur?

    Birim Test
En basit anlamda projemizdeki fonksiyonların çalışıp çalışmadığını kontrol eder. Birden fazla birim testimiz olabilir fakat hepsi birbirinden bağımsız çalışmalıdır. Yani her test için odaklanılan tek nokta vardır. Testler sonuç olarak bize true / false döndürürler.
Birim Test hataları bulmak için kullanılmaz, bizim verdiğimiz girdiler ile fonksiyonun çalışırlığını kontrol eder.
Projemizde kaç tane fonksiyon varsa o kadar test olmalıdır.
Birim Test nedir? sorusuna cevap bulduktan sonra şimdi neden kullanılıra gelelim;

    Yazılım Projesinde Birim Test'in Önemi nedir?
Bize kaliteli kod yazmamızı sağlar. Projeyi geliştirme esnasında yanlışlarımızı görmemizi sağlar. Bütün bileşenleri birbirinden bağımsız bir biçimde tasarlamış oluruz. Böylelikle bakımı daha kolay ve kaliteli bir yazılım ortaya çıkar.
Şimdi Java'da test olayına bakalım;

    JUnit nedir? - Junit'de kullanılan assertion / annotation kavramları nelerdir?
Projemizde bulunan fonksiyonların doğru çıktı verip vermediğini kontrol etmemize yarayan Java kütüphanesidir. Testimizin çalışabilmesi için öncesinde ve sonrasında olması gereken işlemler olabilir. Örnek olarak test edeceğimiz fonksiyonun çalışabilmesi için bir veritabanı bağlantısı gerekiyorsa bunu testten önce sağlamamız gerekir. Böyle durumlarda annotation kullanırız. Testlerde kullanılan annotation'lara bakarsak;

@Test :  Metodun test edileceğini gösterir
@Test(expected = Exception.class) :  Metod hata fırlatmalıdır
@Before : Metodtan önce çalışır.
@After :  Metodtan sonra çalışır
@BeforeClass : Sınıf instance olduğunda bir defalığına çalışır
@AfterClass :  Metodları test ettikten sonra çalışır
@Ignore : Test edilmesini istemediğimiz metodları temsil eder

Test ettiğimiz fonksiyonların dönüş değerlerine göre durum karşılaştırmaları yaptığımız assertionlar vardır.
Bunların kullanımına bakacak olursak;

public class OrnekTest{
 
 @Test
 public void tabikiTest(){
  String name = "Kerem";
  assertEquals(name, OrnekSinif.getPersonName());
 }
}

OrnekSinif(nasıl bir sınıf ismiyse :D )'ın getPersonName() fonksiyonundan dönen isim ile bizim oluşturduğumuz ismi karşılaştırıyoruz.
assertEquals() metodu bu iki değer doğruysa test sonucunu true olarak döndürecektir.
Birçok assertion bulunmaktadır bunların tam listesi.

Şimdi artık Eclips'te bir JUnit oluşturup, çalıştırmaya bir bakalım:

✖ Öncelikle projemize JUnit bağımlılıklarını ekliyoruz.

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
</dependency>

✖  New → Other  JUnit → JUnit Test Case 
Daha sonra testimizin ismini belirleyip Finish diyoruz.

import org.junit.Test;


public class TestOrnek {

 @Test
 public void test() {
  fail("Not yet implemented");
 }
}

Oluşan testimizin içeriği böyle oluyor.
Burada @Test kısmına girdileri verip sonuçların doğruluğunun kontrolünü yaparız.

Şimdi bu testimize örnek bir uygulama yapalım.

import static org.junit.Assert.*;
import org.junit.Test;

public class TestOrnek {
 public int topla(int x, int y){
  int sonuc = 0;
  sonuc = x + y;
  return sonuc;
 }
 @Test
 public void test() {
  int sonuc=0;
  sonuc = topla(5, 10);
  assertEquals(15, sonuc);
 }
}

Burada eğer topla fonksiyonumuzun sonucu 15 ise testimiz true olarak dönüş yapacaktır.


Testimizin çalışırlığını böylece kontrol etmiş oluruz.
İyi çalışmalar.

4 Ağustos 2016 Perşembe

Bootstrap Kullanarak Form Oluşturmak

Herkese merhaba, web kütüphanelerinden biri olan Bootstrap ile girilen bir json formatını kullanarak form oluşturmaktan bahsedeceğim.

Öncelikle Bootstrap'in ne olduğu hakkında bir şeyler söyleyecek olursam;

Bootstrap; HTML, CSS ve JS'i bir arada bulunduran ve bunları kullanarak web arayüzü geliştirebildiğimiz bir kütüphanedir.
CSS'e ek olarak CSS önişlemcisi olan Less ve Sass'ı kullanır.

Bootstrap açık kaynaklı bir kütüphanedir. Github projesine buradan bakabilirsiniz.

Bootstrap sayfasında birçok uygulayabileceğimiz örnekler bulunmaktadır.

Şimdi bir json girdisine karşılık gelen formumuzu oluşturalım.

1-) İlk adım olarak formumuzda hangi alanların oluşmasını istiyorsak o alanları json formatında javascript kodumuzun içerisinde belirtiyoruz.
var fields, form;

fields = [ 
    {
        name: 'username',
        label: 'Username',
        type: 'text'
    }, {
        name: 'password',
        label: 'Password',
        type: 'password'
    }, {
        name: 'fruit',
        label: 'Fruit',
        choices: [
            ['apple', 'Apple'],
            ['pear', 'Pear'],
            ['orange', 'Orange']
        ],
        type: 'selectmultiple2' 
     }, {
        label: 'Submit',
        type: 'submit',
        class: 'btn-danger',
        icon: 'ok'
    }];

2-) Daha sonra bu json girdisini alıp alanlarıyla form oluşturabileceğimiz formata çeviriyoruz.

fields = JSON.stringify(fields);
        fields = formatter.formatjson(fields);
        demoInput = $('#form-demo-input');
        demoInput.val(fields);
          
        outputForm = $('#form-demo-output');
        outputForm.submit(function() {return false});
Bu işlemleri gerçekleştirdiğimizde formumuz şekildeki gibi oluşur;


Kodun tamamı ve uyguladığım örneğe linkten ulaşabilirsiniz.
İyi çalışmalar ve kolaylıklar dilerim.

1 Ağustos 2016 Pazartesi

Rest Api'yi Swagger Uyumlu Hale Getirmek

Herkese merhaba, bu yazımda bir Rest Apinin Swagger uyumlu hale getirilmesindeki adımlardan bahsedeceğim. Neleri eklememiz gerektiğinden, hangi özellikler için hangi metodları kullandığımızdan bahsedeceğim.

*Swagger-UI: 
Bir bağımlılığa sahip değildir, kendi yerel makinemizde çalıştırabiliriz. Apinin swagger uyumlu hale geldikten sonraki görüntüsüne örnek olarak petstore uygulaması verilebilir.

Şimdi apiyi swagger uyumlu hale getirmek için izlenecek adımları sırayla uygulamaya başlayalım.

1-)Öncelikle apimizde bulunan pom.xml dosyasının içine gereken bağımlılıkları ekliyoruz.

<dependency>
    <groupId>io.swagger</groupId>
    <artifactId>swagger-jaxrs</artifactId>
    <version>${swagger-version}</version>
    <scope>compile</scope>
</dependency>
2-) Daha sonra buradan Swagger-ui paketini indiriyoruz.

-> Bu indirdiğimiz paketin içindeki dist klasörünün içindeki bütün dosyaları kopyalıyoruz.
-> Projemizin içinde src/main/webapp içine bir swagger klasörü oluşturalım. Kopyaladığımız bütün dosyaları bu klasörün içine yapıştıralım.

3-) Şimdi de webconfig.java dosyamızın içine port bilgisi, url bilgisi, uygulama adı gibi swaggerı servera tanımlayacak bilgileri giriyoruz.

4-) Şimdi ise apimizi swagger uyumlu hale getirebilmek için kod içeriklerinde değişiklikler yapıyoruz.

Bu kısımda birçok ek açıklamalar kullanıyoruz.

@Api: Başına getirilen sınıfı bir swagger kaynağı olarak işaretler.

@ApiModel: Swagger modelleri hakkında bilgiler eklememizi sağlar.

@ApiOperation: Özel olarak belirlediğimiz bir yola karşılık gelen bir tanımlama yapar.

@ApiParam: İşlemdeki parametreleri tanımlarız.

@ApiResponse: İşlem sırasında oluşabilecek hataları tanımlarız.

Tüm bunları gerçekleştirdikten sonra şekildeki gibi bir görüntü çıkar.

Burada petstore uygulamasının Pet, Store ve User modellerinden User'ın içindeki işlemler yer almaktadır.

Bu uygulamanın kaynak kodu şu adreste bulunmaktadır.
 İyi çalışmalar dilerim.

27 Temmuz 2016 Çarşamba

Swagger-Codegen ile Kod Oluşturma

Selamlar, bu yazımda Swagger araçlarından biri olan Swagger-Codegen ile var olan bir apiyi generate etmekten bahsedeceğim.

Öncelikle Kod Oluşturma nedir bunu açıklayacak olursam;
Var olan kodlara kod yazma yeteneği kazandırma işlemidir diyebiliriz. Örneğin elimizde herhangi bir dilde yazılmış bir api var. Biz bunu başka bir dile çevirmek istiyoruz. Bu noktada Kod Oluşturma yapmamız gerekmektedir. Birçok dilde bu işleme özel araçlar bulunmaktadır.

Ben bu yazımda bahsettiğim örneği açıklayacağım. Bir dilde yazılmış örnek bir apiyi Swagger-Codegen aracını kullanarak başka bir dile generate edilişinden bahsedeceğim.

*Swagger-Codegen

 Apiyi generate ederken Java kullanacağım.

-> Öncelikle Swagger-Codegen .jar dosyasını buradan indirmemiz gerekiyor.

-> Daha sonra aşağıdaki komutları sırasıyla uygulayarak elimizde bulunan apiyi istediğimiz bir dile çevirebiliriz.

$ git clone https://github.com/swagger-api/swagger-codegen

$ cd swagger-codegen

$ mvn clean package

$ java -jar modules/swagger-codegen-cli/target/swagger-codegen-cli.jar
        generate \
    -i  http://petstore.swagger.io/v2/swagger.json \
    -l  php \
    -o /var/tmp/php_api_client

Adımlarını takip ederek apiyi php dilindeki haline generate etmiş oluruz.

Buradaki parametrelere bakacak olursak;
i: Apinin .json linki
l: Generate etmek istediğimiz dil
o: Generate etmek istediğimiz yerin uzantısı

Hangi dillere generate edebileceğimizi öğrenmek için;

$ ls -1 modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/

Daha fazla bilgiyi Swagger-Codegen Github sayfasından edinebilirisiniz.
Umarım faydalı olmuştur iyi çalışmalar.

26 Temmuz 2016 Salı

Swagger ve Araçları

Herkese merhaba, bu yaz stajında Swagger ile ilgili çalışmalar yapıyorum. Bu süreçte öğrendiğim konulardan bahsetmek istedim.

*Öncelikle  Open API Initiative'den bahsedecek olursam;

Linux Foundation altında açık denetimli bir yapı olarak oluşturulan, gelişmekte ve yükselişte olan bir tanımlama formatıdır. Swagger Specification doğrudan Open Specification'ın temeline dayanarak OAI'ye eklenmiştir.

*OpenAPI Specification(The Swagger Specification);

OpenAPI Specification'ın hedefi; insanların ve bilgisayarların anlayabilmesi için REST API'lerin arayüzlerine dilden bağımsız bir standard tanımlamaktır. OpenAPI var olan bir apiyi tekrar yazmamamızı sağlar ama OpenAPI Specification'ın yapısında tanımlanmış servislerin yeteneklerini belirlemek gerkir.

*Swagger nedir ve hangi amaçla kullanılır?

Swagger; REST Apilerin web ortamında kullanıcılara daha basit ve kullanışlı bir şekilde sunulmasını sağlar. Birçok dile frameworkü bulunmaktadır.
Bir diğer avantajı, herhangi bir dilde yazılmış bir REST Api'yi başka bir dile dönüştürmeye uygundur( Code Generation ).

Bu proje içinde kendi araçlarını barındırır. Bunları inceleyecek olursak;

*Swagger Core: Swagger'ın bir Java uygulamasıdır diyebiliriz. Github'ta uygulamalı olarak Java ile bir Swagger uygulaması bulunmaktadır.

*Swagger Codegen: Bir dilde yazılmış REST Api'leri istediğimiz dile dönüştürme işlemine yardımcı olur. Bunun java dili yardımıyla yapılışı Github'ta bulunmaktadır.

*Swagger UI: Swagger uyumlu hale getirilmiş Api'yi kullanıcıya sunan bir araçtır. Bu aracın da uyarlanışı Github'ta bulunmaktadır.

*Swagger Editor: Swagger tanımlamalarını YAML veya JSON formatta oluşturur. Sitesinde bulunan api'yi Generate Client bölümünden istediğimiz dile çevirebiliriz. Swagger Codegen'in yaptığı işlem buna karşılık geliyor. Bu uygulama konuyu anlamak için faydalı oldu benim için.
Uygulama linki  

*Swagger IRC

Peki her şeyi tasarladık adımları uyguladık kullanıcıların karşısına nasıl bir görüntü çıkacak;



















Şekilde görüldüğü gibi uygulamadaki bir bölümle iligli işlemler kullanıcıya listelenmektedir. Kullanıcı istediği işlemi gerekli parametreleri girerek gerçekleştirebilir.

Bu yazımda Swagger'ın ne olduğundan, araçlarından, hangi kolaylıkları sağladığından bahsettim. Bir sonraki yazılarımda araçların nasıl kullanıldığından ve bir apinin Swagger uyumlu hale nasıl getirildiği hakkında yazacağım.
Görüşmek üzere.

3 Mayıs 2016 Salı

LibreOffice Hackfest 2016 - Ankara

Herkese merhaba, bu sene Ankara'da TÜBİTAK-ULAKBİM tarafından bir Hackfest gerçekleşti.

Etkinlik heyecan vericiydi benim için. Çünkü LibreOffice geliştiricilerinden Michael Meeks, Marcus Mohrhard ve Jan-Marek Glogowski'de katıldılar.

İlk gün geliştiricilerin yaptığı sunumları dinledik. Bu sunumlar bana birçok şey kattı. Çünkü yeni bakış açılar kazanıp, çalıştığımız alanın bilmediğimiz inceliklerini öğrendik.

Sonraki 2 günde uğraştığım iki tane hata kaydı üzerinde çalıştım. Çalışırken takıldığımız yerlerde geliştiricilere sorup o an halletmek çok iyi oldu.

Ben LibreOffice Base bileşeni üzerinde çalışıyorum. Bununla ilgili Michael Meeks'e merak ettiğim bütün soruları sordum. Etkinliğin en iyi yönlerinden birisi de buydu benim için; o an merak ettiğim ya da takıldığım konuyu geliştiricilerle çözmek.

Etkinliğe çalışmaktan büyük keyif aldığım Çanakkale ekibi ile katıldım :)


Etkinlikte sabahtan akşama kadar kodlama yaptık ama keyifimiz gayet yerindeydi. Çünkü çalışma performansımızdan memnunduk :)



Etkinliğe katılmam beni hem mutlu edip hem de birçok şey kattı.
Öncelikle +Necdet hocama, TÜBİTAK-ULAKBİM'e, orada tanıştığımız Muhammet Kara ve Gökhan Gurbetoğlu'na, tabiki yurt dışından gelen Michael Meeks, Marcus Mohrhard ve Jan-Marek Glogowski'ye çok teşekkür ediyorum.

Yakında görüşmek üzere :) 

28 Mart 2016 Pazartesi

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

Herkese merhaba, Özgür Yazılım ve Linux Günleri bu sene 26-27 Mart tarihlerinde İstanbul Bilgi Ünversitesi'nde gerçekleşti. Etkinliğe ilk defa bu sene katıldım.

Neden daha önceden katılmadığımı kendime birçok kez sordum :) Çünkü oradaki ortam çok mutlu etti beni. Yeni insanlarla tanışmak yeni bilgiler öğrenmek farklı bakış açıları kazanmak insana çok fayda sağlıyor.

Etkinlikte dinlediğim beni en çok etkileyen sunum +Necdet Yücel  ve +Kaan Ozdincer 'in "Yine Yeniden Özgür Yazılım" sunumuydu. Özgür Yazılım ile ilgili doğru bilinen yanlışlar, eksik kalan tanımlamalar, bu alanda nelere dikkat etmemizin gerektiği gibi daha birçok şey öğrenmiş oldum. Bunlar benim için teknik bir bilgiden daha önemliydi. Çünkü benimsediğim ve çalışmayı istediğim bir alan hakkında en ince ayrıntıya kadar bilgi sahibi olmuştum. Böylece hayatımda etkisi çok fazla olan bir 45 dakikaydı benim için :)


Bir başka severek dinlediğim sunum ise +Aydan Taşdemir 'in "Pgbarman ile PostgreSQL Yedekleme" sunumuydu. LibreOffice Base bileşeni üzerinde çalıştığım için veritabanıyla ilgili bir sunum dinlemek çok iyi oldu benim için. Özellikle şu anda uğraştığım iş PostgreSQL ile ilgili olduğundan bu sunum bana çok faydalı oldu. PostgreSQL ile ilgili yeni bir özellik öğrenmiş oldum.

Biz yine Çanakkale'den kalabalık bir ekiple geldik. Bu etkinliğin benim açımdan önemi ayrı bir büyüktü. Çünkü sunumlardan birisini biz yapacaktık, içimde sadece o an tanımlayabileceğim bir heyecan vardı :)

Bizim sunumumuz "LibreOffice Geliştirme ve Yaygınlaştırma" toplantısı şeklinde gerçkleşti. 13 kişilik büyük bir ekip olarak bugüne kadar yaptığımız çalışmalardan bahsettik. Kendi söylediklerimde ve arkadaşlarımı dinlerken şunu farkettim; gerçekten süreç çok fazla çalışmayı gerektiriyor. Bir iş üzerinde haftalarca hatta aylarca pes etmeden ısrar etmek gerekebiliyor. Ama sonunda kazanılan bilgiler ve çalıştığınız işi bitirdiğinizi görmek aşırı mutluluk veriyor :)



Bir sonraki yazıma kadar daha çok çalışıp sizlere daha iyi haberler vermek istiyorum görüşmek üzere :)

8 Şubat 2016 Pazartesi

AB2016 - LibreOffice Geliştirme Atölyesi

Bu sene Akademik Bilişim Aydın Adnan Menderes Üniversitesi'nde gerçekleşti. Etkinlikte 4 gün süren eğitimler ve sonrasında 3 gün konferanslar yapıldı.

Biz Çanakkale'den kalabalık bir ekiple "LibreOffice Geliştirme Atölyesi" eğitimine katıldık. 4 gün boyunca sabah 9 - akşam 6 saatleri arasında çalışmak benim için çok faydalı oldu. 4 gün boyunca LibreOffice deposuna gönderdiğim 2 yamam alındı :) bunların linkleri Link1 ve Link2 

Eğitimde her gün kendime bir şeyler katarak ilerledim. Biten günün sonunda yeni bilgiler öğrenerek yurda gitmek gerçekten çok mutluluk verici oluyor. Sabah bir de yama kabul mailiyle uyanmak +1 mutluluk oluyor :)



Çalışırken bir yerde takıldığımızda soru sormak istediğimizde hemen yardımımıza koşan sabırla bizleri dinleyen :) +Gülşah Köse , +aybüke özdemir , +Berk Güreken ve +yeliz taneroğlu eğitmenlerimize teşekkür ediyorum.

Bu organizasyonda emeği geçen +Mustafa Akgul ve +Necdet Yücel hocalarıma çok teşekkür ederim.

Çok çalışmak gerçekten çok mutluluk verici :)

26 Ocak 2016 Salı

Packathon Macerası

23 Ocak tarihinde İstanbul'da Bahçeşehir Üniversitesi'nde gerçekleşen Packathon etkinliğine Kripton ekibi olarak katılmaya karar verdik. Etkinlikle ilgili bilgiye buradan ulaşabilirsiniz.

Etkinlikte çalıştığım ekip arkadaşlarımla 1 gün boyunca öyle bir ortamda çalışmak bana çok şeyler kazandırdı. Günün başlangıcında ekip olarak görev paylaşımında bulunduk. Üzerime düşen görevi yapmam gerektiğinin bilinciyle insan çalıştığından daha fazla çalışıyor. Hepimiz çok çalışıp hedeflediğimiz işleri yerine getirdik. Günün sonunda böyle sonuçlar görmek insanı çok fazla mutlu ediyor ve daha çok çalışma isteği kazandırıyor.

Gün içerisinde çalışırken sürekli meslek hayatımda da böyle bir ortamda olmanın beni mutlu edebileceğini düşündüm. Çünkü üzerinde çalıştığım alan keyif veriyor, birlikte çalıştığım arkadaşlarla o alanda çalışmak gerçekten çok keyifli oluyor. Tatil gününde dışarda kar yağarken birlikte kod yazmak gerçekten çok mutlu edici :) 

Etkinliğinin düzenlenmesinde emeği geçen herkese teşekkür ediyorum. Beni çok mutlu eden etkinlikten sonraki duygularımı paylaşmak istedim ve tabiki bir gün boyunca benimle birlikte çalışan ekip arkadaşlarıma da teşekkür ediyorum. 

O günden çok sevdiğim bir fotoyu paylaşmak istiyorum ( Gerçekten haberimiz yoktu :) )