Log4J Nedir?

Merhaba arkadaşlar, bu yazımda size Log4J adlı bir loglama kütüphaneden bahsedeceğim.

Öncelikle loglama nedir?

Loglama bir sistemin hareketlerini kaydeden bir yapıdır. Özellikle sistem yöneticileri ve hata gideren kullanıcılar ve hatta geliştiriciler için bir vazgeçilmezdir. Log4J ‘den önce de loglama yapılıyordu aslında, log4J standart loglama kütüphanesini kullanarak işleri bizim için biraz daah kontrollü ve kolay hale getiriyor.

Bu kütüphaneyi kullanabilmek için ise log4j jar dosyası ve log4j properties dosyası yeterlidir.

Log4j ‘de loglama seviye bazlıdır. Bu seviyeler properties dosyasından ayarlanabilmektedir.

log 1

Görüldüğü üzere seviye merkeze doğru gittikçe loglama kapması azalır. Örnek bir log4j.properties dosyası:

# logger options: ALL -> DEBUG -> INFO -> WARN -> ERROR -> FATAL -> OFF

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

# Direct log messages to a daily log file
log4j.appender.file=org.apache.log4j.DailyRollingFileAppender
log4j.appender.file.File=log/loging.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %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{ABSOLUTE} %5p %c{1}:%L – %m%n

Örnek kullanım için sınıf içerisine ilk olarak log4j için bir nesne oluşturmamız gerekli,

private static final Logger logger = Logger.getLogger(SınıfAdi.class);

Gördüğünüz gibi sınıf adı da kullanılarak bir nesne oluşturuluyor. Bunun nedeni hangi loğun hangi sınıftan yazdırıldığının da kaydını tutuyor olmamız.

Bir log mesajı yazdırmak için örnek kodlar:

logger.fatal("fatal log message");
logger.error("error log message");
logger.warn("warn log message");
logger.info("info log message");
logger.debug("debug log message");
logger.trace("trace log message");

 

Her işlem ya da logic kontrol sırasında logger kullanmak ileri yönlü hata kontrolü sağlayacaktır. Çünkü katmanlı projelerde bir hatanın bulunması zaman zaman gerçekten zor olabiliyor. Küçük projelerde pek gerek kalmasa da bunu bir alışkanlık hale getirmek oldukça faydalı olacaktır.

EOC(End Of Code)

S.O.L.I.D. Principles(İlkeleri) Nedir, Neden Kullanılır?

Merhaba arkadaşlar, bu yazımda size SOLID kısaltmasından bahsedeceğim. Tabi ki sadece kısaltmanın anlamından değil biraz detayından da bahsetmeye çalışacağım. SOLID aslında OOP(Object Oriented Programming yani Türkçesiyle nesneye dayalı programlama) yaparken uymamız gereken ilkeler denilebilir. Kullanımı zorunlu değildir ancak, kullanılmadığında çok başınızın ağrıyacağına garanti veriyorum kendi tecrübelerimden.

OOP denildiğinde akla gelen şey, okullarda bize gösterilen kalıtım, arayüzler vs. daha fazlası değil. Bu OOP kullanım tarzıyla geliştirmiş olduğum projelerde çalışmalarım devam ettikçe proje ömrünün ve yeniden kullanım imkanının çok az olduğunu farkettim. Yazılarımda Tasarım Desenleri bu sorunun çözüm kaynaklarından biri. Ancak etkili bir çözüm için SOLID ilkelerine uymak gerekiyor.

SOLID ilkeleri için basitçe söylemek gerekirse OOP ‘de bağımlılık yönetimi biçimidir. Bu ilkeler olmadan oluşturulan projeler esneyemez, kırılgan ve sabit özelliklerde oluyor. Yeni bir özellik ya da güncelleme yapmak istediğinizde projeyi baştan değiştirmeniz bile gerekebiliyor. Bunun nedeni kötü proje mimarisidir.

SOLID ilkelerinde anahtar kelime Loose Coupling yani gevşek bağımlılıktır. Sınıf ve arayüz ilişkilerinde bağımlılık ne kadar az olursa proje o kadar esnek olacaktır. Artık şu SOLID ‘i açıklayalım.

S – Single Responsibility Principle (SRP)

Bir sınıfın sadece bir sorumluluğu olmalıdır. Bir sınıf birden fazla işle ya da katmanla ilişkilendirilirse yönetimi ve geliştirimi zorlaşır.

O – Open/Closed Principle (OCP)

Bir sınıf gelişime açık, ancak değişime(mevcut kodların) kapalı olmalıdır. Bir sınıfa yeni bir özellik ekleme halinde sınıfın mevcut kodlarının değişmesi gerekiyorsa bu o sınıfın Loose Coupling kuralında uymadığı anlamına ve yeterli esneklik sağlamadığı anlamına gelir.

L – Liskov ‘s Substitution Principle (LSP)

Sınıfların kendi alt sınıflarıyla değiştirilebilir olması gerekmektedir. Basit bir örnek olarak çok biçimlilik konusu örnek verilebilir. Ancak bu durumun tam tersinin de işleyebiliyor olması gerekmektedir.

I – Interface Segregation Principle (ISP)

Arayüzlerin ayrımı anlamına gelen bu ilke, bir arayüzü implemente alan sınıfların gereksiz (kullanılmayan) metotları bulundurmaya zorlanmasının önlenmesidir. Mümkün olduğunda ortak özellikler arayüz halinde tasarlanmalı ve gerekirse farklı arayüzler birbirinden extend almalıdır.

D – Dependency Inversion Principle (DIP)

Yüksek seviyeli sınıflar, düşük seviyeli sınıflara bağımlı olmamalıdır her ikisi de soyut kavramlara bağlı olmalıdır. Çünkü somut sınıflarda değişikliklerin meydana gelme durumu daha fazladır.

Bu tanım sanırım oldukça genel ancak biraz daha açmak gerekirse, bir sınıf başka bir sınıf içerisinde bir örneği bulunduğu durumları göz önüne alalım. Bu sınıfta yapılmak istenecek ufak bir değişiklik O ilkesini çiğneyecektir. Bu yüzden farklı bir yaklaşım olarak bu sınıfları bir soyut sınıf veya arayüz yardımıyla birbirine bağlamak daha doğru olacaktır.

Bu ilkeler uyulması halinde geliştirdiğiniz her proje sizin için bir ilerleme olacaktır. Nasıl bir ilerleme derseniz, mesela her seferinde aynı sınıfları yeniden tanımlamak zorunda kalmazsınız. Daha önceki projelerinizdeki kodlarınızı Maven ve Tasarım Desenleri sayesinde yeni projeniz için adapte ederek bir adım daha atarsınız. Bu şekilde geliştirme yapmak size daha büyük projeleri daha kısa zamanlarda geliştirme imkânı verecektir.

EOC(End Of Code)

 

AOP(Aspect Oriented Programming) Nedir?

Merhaba arkadaşlar, bu yazımda size AOP ‘dan yani Türkçesiyle “Görünüşe Göre Programlama”dan bahsedeceğim. İsim sizi yanıltmasın farklı bir kullanım anlamı var. AOP denildiğinde akla gelen ilk şey sanırım OOP ‘dir. Ancak bu iki programlama yöntemi birbiri için rakip olarak düşünülmesin. AOP, OOP kullanılırken bazı sorunların kolay bir şekilde çözülmesi için geliştirilmiştir. Tabi ki bu sorunların çözüm OOP ‘de var ancak çözüm için birkaç takla atmak gerekiyor.

AOP ‘un yapmak üzere geliştirildiği şey, birbiriyle kesişen ilgileri (Cross-Cutting Concerns) v e bu ilgilerin oluşturduğu karmaşıklığı çözmektir. Yazılım geliştirirken sanırım en zor konulardan biri de bu ilgileri basitleştirmektir. Neden basitleştirmemiz gerekiyor diye soracak olursanız da cevap, gelişime açık ve yeniden kullanılabilir projeler tasarlayabilmek derdim.

AOP, kesişen ya da diğer bir deyişle çakışan ilgileri modüler hale getirebilmek için sınıf ve metotları barındırır. İlgiler modüller halinde tek bir yerde ayrıştırılır ki bu yaklaşım ilgilerin yönetimini kolaylaştırır. Interceptor, AOP ‘un kesişen ilgileri ayırmakta kullandığı kütüphanelerdir ve kelime anlamıyla araya girme, ayırma anlamlarına gelmektedir. Bunlardan bazıları; Ninject, Unity ve Castle ‘dir. Bunları araştırarak detaylı bilgi edinebilirsiniz.

 

EOC(End Of Code)

Restful Web Service Nedir?

Merhaba arkadaşlar, bu yazımda size resful web servislerden yani kısaca rest servislerden bahsedeceğim. Rest servisler tüm bilgilerin kendilerine has birer adrese yani URI(Uniform Resource Idetifier)’e sahip olmasını öngören mimari yaklaşımdır. Tanım oldukça anlamsız geliyor değil mi? Biraz daha açalım öyleyse, rest servisler birer url üzerinden çalışırlar ve bu urller benzersizdir aynı ID gibi. İstemci ve sunucu arasındaki iletişim stateless bir protokol üzerinden (genellikle HTTP) sağlanır.

Restful servislerin Java dünyasındaki standartlarını oluşturan JAX-RS spesifikasyonudur. İlk servislerimi jax-rs standart API ‘i ile yazmıştım. Ancak Spring kullanan arkadaşlara bir tavsiyem Apache CXF kullanmaları yönünde. Farklı servislerden bahsedecek olursak;

  • Jersey: GlassFish grubu tarafından geliştirilmektedir.
  • Apache CXF: Hem SOAP hem de rest servis geliştirmek isteyenler için ideal bir çözüm olacaktır, Spring için CDI uyumluluğu olması yönünden oldukça rahat kullanılabilir.
  • RestEASY: Redhat grubu tarafından geliştirilmektedir. Seam kullanımı için idealdir.
  • Restlet: Jersey ‘den farklı yanı olarak nesneleri serileştirmek için Xstream ve Jackson kullanıyor.

Rest servisler son zamanlarda web ve mobil uygulama geliştirirken oldukça popüler hale geldi. Front-end katmanında Javascript kütüphaneleriyle birlikte kullanıldığında hız bakımından sizi inanılmaz derecede rahatlatıyor. Bir istek ya da veri tabanına veri işlemek için sadece http isteklerinin kullanılması, sayfaların tekrar tekrar gereksiz olarak yeniden yüklenmesini engelliyor. Bu sayede sistem oldukça hızlı bir şekilde çalışıyor.

Restful servisler genel olarak sunucuyla haberleşmek için JSON kullanıyor. Peki bu bize ne sağlıyor? Bu bize, servis katmanının platformdan bağımsız olmasını sağlıyor. Yani bir yandan html kullanırken bir yandan PHP kullanabilir ya da bir adım öteye giderek bir yandan da IOS ve Android uygulamalarda kullanılabiliyor.

Rest servisleri 4 temel http isteğini kullanmaktadır.

  • GET: Genellikle veri ya da veri listelerini getirmek için kullanılır.
  • POST: Veri tabanına yeni bir kayıt eklemek için kullanılır.
  • PUT: Veri tabanındaki verileri güncellemek için kullanılır.
  • DELETE: Veri tabanındaki verileri silmek için kullanılır.

EOC(End Of Code)

 

 

İlk Yazım

Merhaba arkadaşlar, benim adım Enes KURU. Bir yazılımcı adayıyım. Şuanda Sakarya Üniversitesi Bilgisayar Mühendisliği 2. sınıf öğrencisiyim. Daha yazılım ile uğraşmaya başlayalı fazla olmadı ancak, bir blog tutmanın önemi gerçekten büyük. Hem öğrenmek hem de öğrendiklerimin karşılığını vermek için bir blog açmaya karar verdim.

Üniversite hayatımın 2. döneminin başında bir şirkette part-time olarak çalışmaya başladım ve öğrenim hayatıyla çalışma hayatı arasındaki farkı daha erkenden görmeye başladım. Okul hayatıyla iş hayatının farkı küçümsenemeyecek kadar büyük olmakla beraber çoğu öğrencinin düşündüğü şey “Mezun olduktan sonra bir şirkete girip kendimi geliştiririm“.

Okul hayatı boyunca eğer kendinizi geliştirmezseniz mezun olduğunuzda da kendinizi geliştirmeye fırsat bulamazsınız. Her zaman bölüm derslerinin üstüne katmalısınız. Çünkü o derslerde size gösterilen buz dağının bulutlarının üstünde kalan kısmı. Evet bazı dersler sıkıcı, zor veya bölümle alakasız olabilir. Ya da hocanızdan kaynaklı problemler olabilir. Ancak bunlar her üniversite öğrencisinin atlatması gereken zorluklar.

Size derslerde öğretilenlere değil size uygunluğuna bakmalısınız 2. sınıf veya 3. sınıfa kadar artık sektörde ne iş yapacağınızı kafanızda belirlemiş olmanız gerekiyor. Seçtiğiniz alanda her zaman kendinizi geliştirmelisiniz. Okul hayatında kendine birşeyler katabilmiş yazılımcılar her zaman bir adım öndedir. Seçtiğiniz alanda staj yaparak (ama gerçekten staj yaparak) tecrübe edinmelisiniz. Staj yaptıkları yerlerden iş teklifi alan çok öğrenci var. Neden birisi de siz olmayasınız?

Eski bir hocam bir gün bana “Eğer bir işi kimse yapmadıysa seçebileceğin 2 yol vardır” demişti. İlki “kimse yapmadıysa ben nasıl yapayım?“, ikincisiyse “kimse yapmadıysa neden ilk ben yapmayayım?“. Evet yazılımda olsun hayatın diğer alanlarında olsun bir işte başarılı olmanın en önemli kriteri azimdir. Hedefine kararlı adımlarla yürümek size kalmış.

İyi kodlamalar…