Linux Htop

Çogu kullanici linux isletim sisteminde çalisan processleri komut satirindan izlemek ve processlerin CPU ve Memory kullanimlarini görmek için top komutuna kullanir. 
Htop; linux sunucu üzerinde anlık olarak hangi işlemlerin ne kadar kaynak tükettiğini görebildiğiniz, CPU,ram ve anlık load durumlarını gösteren bir izleme programıdır.
htop uygulamasinda ilk göze çarpan farklilik, ekranin en üstünde tüm çekirdeklerin, hafizanin ve swap alaninin kullanim miktarini gösterir bir text grafigin yer almasi. Bu kisim top komutuna göre çok daha anlasilir ve kullanisli.






Kaynak : http://www.yazilimmutfagi.com/11444/genel/linux/linuxda-system-processlerini-izlemek-icin-htop-komutunu-kullanmak.aspx

Kaynak : https://www.netinternet.com.tr/bilgi-bankasi/linux-icin-htop-kurulumu

Bonus :

Official Spring Boot Starter'ları






Starters”: Spring boot bir çok starter jar'larına sahiptir. Örnek uygulamamızda pom.xml'de görebileceğiniz gibi spring-boot-starter-parent'a pom'un parent kısmında sahibiz. Bu özel starter Maven için default değerler sağlar. spring-boot-starter-parent ayrıca bağımlılık yönetimi bölümünü sağlar; böylece "kutsanmış" sürüm etiketlerini atlayabilirsiniz. Yani diğer starter bağımlılıklar için sürüm etiketi girmenize gerek kalmaz.
Diğer starterlar projenin ihtiyaçlarına göre bağımlılıkların indirilmesini sağlarlar. Mesela web uygulaması yapacaksak spring-boot-starter-web'i pom'un bağımlılıklar kısmına ekleriz.
Eğer örnek pom'umuzda  mvn dependency:tree pluginin goal'ini çalıştırısanız ,starter-web'in ihtiyacı olduğu bağımlıkları indirdiğini ve bağımlıkılık ağacını görebiliriz.(Tomcat web server'ı ve Spring Boot kendisi dahil olmak üzere.)
Offical starter'ların yazım deseni spring-boot-starter-* şeklindedir.
Eğer inherit edilmiş bağımlılıkların versiyon numarası değiştirilmek istenirse propertilerin override edilmesi yeterlidir.


 Spring Boot application starters


spring-boot-starter : Core starter, autoconfiguration destağini içerir, ayrıca logging ve YAML içindir.

spring-boot-starter-activemq :Apache ActiveMQ kullanmak için JMS messaging starter.

spring-boot-starter-amqp   : Spring AMQP ve Rabbit MQ kullanmak için gerekli starter.

spring-boot-starter-aop : Spring AOP veAspectJ kullanarak  aspect-oriented programming kullanmak için gerekli starter.

spring-boot-starter-artemis : Apache Artemis kullarak JMS messaging sağlayan starter.

spring-boot-starter-batch : Spring batch kullanmak için gerekli starter.

spring-boot-starter-cache : Spring framework'ün cach'ini kullanmak için gerekli starter.

spring-boot-starter-cloud-connectors : Heroku ve Cloud Foundry gibi cloud platformlarına bağlanmayı kolaylaştıran Spring Cloud Connectorlerini kullanmak için gerekli starter.

spring-boot-starter-data-cassandra : Dağıtık database olan Cassandra ve Spring Data Cassandra kullanmak için gerekli starter.

spring-boot-starter-data-couchbase : Document-oriented database olan Couchbase  ve Spring Data Couchbase kullanmak için gerekli starter.

spring-boot-starter-data-elasticsearch : Elasticsearch araması ve analatik motoru ve Spring Data Elastichsearch kullanmak için gerekli starter.

spring-boot-starter-data-gemfire : Gemfire veri deposu ve Spring Data Gemfire kullanmak için gerekli starter.

spring-boot-starter-data-jpa : Hibernate ile Spring Data JPA'nın kullanılması için gerekli starter.

spring-boot-starter-data-ldap : Spring data LDAP kullanılması için gerekli starter.

spring-boot-starter-data-mongodb : Document-oriented database olan MONGODB'nin ve spring data mongodb'nin kullanılması için gerekli starter.

spring-boot-starter-data-neo4j : Graph database olan neo4j'nin ve spring data neo4j'nin kullanılması için gerekli starter.

spring-boot-starter-data-redis : Key-value şeklinde veri deposu olan redisin ve spring data redisin kullanılması için gerekli olan starter.

spring-boot-starter-data-rest : Spring data repositorylerinin Spring data rest kullanılarak rest servislere açılmasını sağlamak için kullanılan starter.

spring-boot-starter-data-solr : Bir arama platformu olan Apache Solr'un Spring Data Solr ile kullanılmasını sağlayan starter.

spring-boot-starter-freemarker  :  MVC web aplikasyonlarının View kısmında Freemarker kullanmak için gerekli starter.

spring-boot-starter-groovy-templates : MVC web aplikasyonlarının View kısmında Groovy templateleri kullanmak için gerekli starter.

spring-boot-starter-hateoas : Spring MVC ve Spring HATEOAS ile hypermedia temelli rest servisler yaratmak için kullanılan starter.

spring-boot-starter-integration : Spring integration kullanmak için gerekli starter.

spring-boot-starter-jdbc : Tomcat JDBC connection pool ile JDBC kullanmak için gerekli starter.

spring-boot-starter-jersey : spring-boot-starter-web 'a alternatif olarak JAX-RS ve Jersey ile RES:Tful web aplikasyonları inşaa etmek için gerekli starter.

spring-boot-starter-jooq : spring-bootstarter-data-jpa veyaspring-boot-starter-jdbc' ye alternatif olarak SQL veritabanlarına erişmek için kullanılan JOOQ için gerekli starter.

spring-boot-starter-jta-atomikos : Atomikos kullanarak JTA transactionların kullanılmasını sağlayan starter.

spring-boot-starter-jta-bitronix : Bitronix kullanarak JTA transactionların kullanılmasını sağlayan starter.

spring-boot-starter-jta-narayana : Spring Boot Narayana JTA Starter

spring-boot-starter-mail : Java Mail ve Spring Framework’ün email gönderme desteği için kullanılan starter.

spring-boot-starter-mobile : Web aplikasyonları yaratmak için kullanılan Spring Mobile'in kullanılması için gerekli starter.

spring-boot-starter-mustache : MVC web aplikasyonlarının View kısmında mustache templateleri kullanmak için gerekli starter.

spring-boot-starter-security : Spring security kullanmak için gerekli starter.

spring-boot-starter-social-facebook : Spring social facebook kullanmak için gerekli starter.

spring-boot-starter-social-linkedin : Spring social linkedin kullanmak için gerekli starter.

spring-boot-starter-social-twitter : Spring social twitter kullanmak için gerekli starter.

spring-boot-starter-test : Spring boot uygulamalarını test etmek için ( JUnit, Hamcrest ve Mockito) gerekli starter.

spring-boot-starter-thymeleaf  : MVC web aplikasyonlarının View kısmında thymeleaf   kullanmak için gerekli starter.

spring-boot-starter-validation : Java Bean Validasyonunu Hibernate Validotor kullarak gerçekleştirmek için gerekli starter.

spring-boot-starter-web  : Spring MVC kullanarak RESTfuşl dahil olmak üzere web uygulamaları inşaa etmek için kullanılan starter. Tomcat'i default gömülü web container olarak kullanır.

spring-boot-starter-web-services : Spring web servislerini kullanmak için gerekli starter.

spring-boot-starter-websocket  : Spring Framework'in Websocket desteğini kullanrak Websocket uygulamaları geliştirmeyi sağlayan starter.

Spring Boot production starters


spring-boot-starter-actuator : Spring boot uygulamanızı monitor ve yönetme işlemini gerçekleştiren ve production-ready özellikler taşıyan Spring boot Actuator uygulamasının kullanımını sağlayan starter.

spring-boot-starter-remote-shell : CRaSH remote shell kullanarak uygulamanızı ssh ile bağlanarak uzaktan yönetmenizi ve monitor etmenizi sağlayan starter. Spring Boot 1.5.10 sürümünden sonra deprecated olmuştur.


Spring Boot technical starters 


spring-boot-starter-jetty : spring-bootstarter-tomcat'a alternatif olarak gömülü olarak jetty servlet container'ını kullanmanızı sağlayan starter.

spring-boot-starter-log4j2 : spring-boot-starterlogging'a alternatif olarak logging işlemleri için log4j2 kullanmanıza olanak sağlayan starter.

spring-boot-starter-logging : Logback kullanrak logging işleminizi gerçekleştiren starter. Default olarak gelen logging starter budur.

spring-boot-starter-tomcat : spring-bootstarter-web starter tarafından default olarak kullanalan tomcat server'ı gömülü olarak kullanan starter.

spring-boot-starter-undertow : spring-boot-startertomcat'a alternatif olarak gömülü olarak undertow servlet container'ı kullanan starter.

İlave olarak ekstra starterlar için listeye şuradan ulaşabilirsiniz :

https://github.com/spring-projects/spring-boot/blob/v1.5.10.RELEASE/spring-boot-starters/README.adoc 

Kaynak : https://docs.spring.io/spring-boot/docs/current/reference/pdf/spring-boot-reference.pdf

Spring Boot - Notlarım - 01




@EnableAutoConfiguration anatosyonu : Class düzeyinde bir anatosyondur. Maven'e veya gradle'e eklediğiniz bağımlılıklara göre Spring tahminlemelerde bulunur ve uygulamanız için oto konfigurasyonlar yapar.
Mesela spring-boot-starter-web Tomcat ve Spring-Mvc'yi uygulamanıza ekler ve web uygulamanızı gerçekleştirdiğinizi anlayıp default oto konfigurasyonlar yapar. Spring boot starter bağımlılıklar için oto konfigurasyonlar yaparken eklediğiniz third party jarlar için de bu işlemi en iyi şekilde yapmaya çalışır.

main metodu : Java uygulamalarını başlatmak için kullanılan geleneksel yaklaşım main metodunun çalıştırılmasıdır.Spring boot uygulamasıda bu noktadan başlatırlır. main metodu SpringApplication class'ını delegate eder ve run metodunu çalıştırır.SpringApplication  class'ı uygulamayı bootstrap eder ve gömülü oto configure edilmiş tomcat'i başlatır. SpringApplication clasına main metodunun bulunduğu class primary Spring Component olarak verilir.




 4.0.0
 com.example
 myproject
 0.0.1-SNAPSHOT
 
 org.springframework.boot
 spring-boot-starter-parent
 1.5.10.RELEASE
 
 

 
 org.springframework.boot
 spring-boot-starter-web
 




import org.springframework.boot.*;
import org.springframework.boot.autoconfigure.*;
import org.springframework.stereotype.*;
import org.springframework.web.bind.annotation.*;
@RestController
@EnableAutoConfiguration
public class Example {
 @RequestMapping("/")
 String home() {
 return "Hello World!";
 }
 public static void main(String[] args) throws Exception {
 SpringApplication.run(Example.class, args);
 }
}

Starters”: Spring boot bir çok starter jar'larına sahiptir. Örnek uygulamamızda pom.xml'de görebileceğiniz gibi spring-boot-starter-parent'a pom'un parent kısmında sahibiz. Bu özel starter Maven için default değerler sağlar. spring-boot-starter-parent ayrıca bağımlılık yönetimi bölümünü sağlar; böylece "kutsanmış" sürüm etiketlerini atlayabilirsiniz. Yani diğer starter bağımlılıklar için sürüm etiketi girmenize gerek kalmaz.
Diğer starterlar projenin ihtiyaçlarına göre bağımlılıkların indirilmesini sağlarlar. Mesela web uygulaması yapacaksak spring-boot-starter-web'i pom'un bağımlılıklar kısmına ekleriz.
Eğer örnek pom'umuzda  mvn dependency:tree pluginin goal'ini çalıştırısanız ,starter-web'in ihtiyacı olduğu bağımlıkları indirdiğini ve bağımlıkılık ağacını görebiliriz.(Tomcat web server'ı ve Spring Boot kendisi dahil olmak üzere.)
Offical starter'ların yazım deseni spring-boot-starter-* şeklindedir.
Eğer inherit edilmiş bağımlılıkların versiyon numarası değiştirilmek istenirse propertilerin override edilmesi yeterlidir.


 Fowler-SR2

Offical starter listesine bu yazım'dan ulaşabilirsiniz.

Java Version : Parent pom'dan default olarak Java 1.6 set edilerek gelmektedir. Java versiyonun değiştirlmesi için de propertisi override edilmelidir.

 1.8





 mvn spring-boot:run :  spring-boot-starter-parent sebebiyle POM çok faydalı olan run goal'ine sahiptir. Projenin kök dizininde maven komutu olarak  mvn spring-boot:run yazarsak projeyi bşlatabiliriz.
$ mvn spring-boot:run



Proje ayağa kalktığına göre tarayıcıdan localhost:8080 adresine girersek Hello World! çıktısını aldığı mızı görebiliriz.

Çalıştırılabilir Jar Elde Etmek : Örneğimizi, içinde çalıştırabileceğimiz tamamen kendi başına yürütülebilir bir jar dosyası oluşturarak tamamlayalım. Çalıştırılabilir jarlar (bazen "fat jar" olarak anılır), derlenmiş sınıflarınızı içeren arşivlerdir
Kodunuzun çalıştırılacağı jar tüm bağımlılıklarıyla birlikte paketlenir.
Java iç içe geçmiş jar dosyalarına izin vermez (i.e. jar dosyalarının içinde jar dosyalarının olması).
Bu self-contained uygulamanın dağıtımında sorun olabilir.
Bu problemi çözmek için,çoğu developer“uber” jarları kullanır. Bir Uber jar basitçe bağımlı olduğu jarlardan bütün classları bir jar arşivi içine paketler
Bu yaklaşımdaki problem hangi kütüphaneyi gerçekten kullandığınızı görememenizdir. Farklı jarlarda aynı sınıfı adına sahip dosyalarda kafa karıiıklığına sebep olabilimektedir. Spring boot içi içe jar işlemindeki bu problemeri çözmek için farklı bir yaklaşım sergilemektedir. Bunu ileride daha ayrıntıılı bir şekilde inceleceğiz.
Çalıştırılabilir jar elde etmek için spring-boot-maven-plugin', pom.xml'e eklememiz gerekmekte. Bu pluginin ayarları parent pom'da default değerlerini almıştır.

dependencies bölümünün altına :

 
 
 org.springframework.boot
 spring-boot-maven-plugin
 

Not : spring-boot-starter-parent POM repackage goal'i için konfigurasyonlara sahiptir.
Eğer bu parent pom'u pom'a dahil etmediyseniz bu konfigurasyonu kendiniz deklare
etmelisizniz.
pom.xml'i kaydedip proje dizininde mvn package'i çalıştırırsanız :



target klasörünün altında yaklaşık 10 MB boyutunda myproject-0.0.1-SNAPSHOT.jar dosyasının oluştuğunu göreceksiniz.
Eğer jar içindeki dosyalara bakmak istiyorsanız :

 jar tvf target/myproject-0.0.1-SNAPSHOT.jar

komutunu kullanabilirsiniz.

Ayrıca spring-boot'un repacakeg ettiği dosya haricinde maven'in oluşturduğu orjinal jar dosyası olan
myproject-0.0.1-SNAPSHOT.jar.original dosyasını da target klasörü altında görebilirsiniz.
Uygulamayı çalıştırmak içim java -jar komutunu kullanıyoruz :


Uygulamayı kapatmak için Ctrl + C tuşlarını kullanabiliriz.


main class'ı konumlandırmak :  Main class'ı kök pakete koymak tercih edilmelidir. Mesela  eğer JPA uygulaması yazıyorsunuz @EnableAutoConfiguration anatasyonu main class'ın bukunduğu kök dizinden başlayarak paketlerde @Entity class'larını arar.
Ayrıca kök dizinde olduğunuz için componentleri tarayan @ComponentScan anatasyonuna ilave olarak base pacakage attribut'ünü girmenize gerek kalmaz.

Örnek bir layout :





package com.example.myproject;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@EnableAutoConfiguration
@ComponentScan

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

Configuration Class'ı : Spring boot uygulaması yazarken Java-based konfigurasyon en populer olandır. Elbetteki bu işlem XML temelli olarak yapılabilmekte ise de, konfigurasyon yapılacak (container için bean üretme) işini class'lara  @Configuration anatasyonu koyarak gerçekleştirirz.
Birincil (primary) kanfigurasyon sınıfı adayımız main metodunun bulunduğu sınıftır.

Enable* ile başlayan anatasyonlar konfigurasyon sınıfına daha önce tanımlanmış java konfigurasyon sınıflarının otomatik olarak import edilmesine güzel bir örnektir.

Ayrıca bir konfigurasyon sınıfı diğer konfigurasyon sınıfını @Import anatasyonuyla import ederek import ettiği konfigurasyon sınıfında yaratılan beanleri kendi konfigurasyon beanlerini şekillendirmek için kullanabilirler. Ayrıca bu işlemi alternatif olarak konfigurasyon sınıfında @ComponentScan anatasyonu kullanarak diğer konfigurasyon sınıfında bulunan beanleri kullanabilme becersi sağlarlar.

Ayrıca bir configurasyon sınıfında @ImportResource anatasyonuyla XML ile konfigure edilmiş bean'lerde import edilebilmektedir.

Auto-configuration : Spring boot projeye eklediğiniz jar'ları otomatik olarak konfigure etmeye çalışır. Örneğin kendi Datasource bean'inizi tanımlarsanız varsayılan gömülü db Datasurce tanımlamanız yok olur.
Eğer uygulamanızın auto configurationlarını görmek isterseniz uygulamanızı --debug modda çalıştırıp ve loglardan auto configurationlarınızı görebilirsiniz.

Eğer bazı class'ların auto configure edilmesini istemiyorsanız @EnableAutoConfiguration anatosyonuna exclude attribute ile classın adını vererek class'ın auto configure edilmesini önleyebilirirsiniz.(Ayrıca property seviyesinde de bu işlemi yapmak mümkündür)
import org.springframework.boot.autoconfigure.*;
import org.springframework.boot.autoconfigure.jdbc.*;
import org.springframework.context.annotation.*;
@Configuration
@EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class})
public class MyConfiguration {
}


Spring Bean'leri ve Dependency Injection : Spring Boot'da beanleri tanımlamak için Spring'de kullandığımız teknikleri kullanmakta özgürüz. Genel olarak  @ComponentScan ile beanleri bulup @Autowired ile bu beanleri uygulamamıza inject ederiz.

Eğer yapınız Spring boot uygulamanızın main methodunun bulunduğu Applicaition classı ise bu sınıfa  @ComponentScan ekleyip tüm @Component, @Service, @Repository, @Controller gibi componentleri uygulamanıza register edebilirsiniz.

Tek Constructor ve field'ın final olması :  Eğer compnent'iniz tek constructor'a sahipse @Autowired'a ihtiyacınız kalmayacaktır : (İlk örenkteki final field için @Autowired kullanımına gerek kalmayacaktır)
package com.example.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class DatabaseAccountService implements AccountService {
 private final RiskAssessor riskAssessor;
 @Autowired
 public DatabaseAccountService(RiskAssessor riskAssessor) {
 this.riskAssessor = riskAssessor;
 }
 // ...
}

@Service
public class DatabaseAccountService implements AccountService {
 private final RiskAssessor riskAssessor;
 public DatabaseAccountService(RiskAssessor riskAssessor) {
 this.riskAssessor = riskAssessor;
 }
 // ...
}




@SpringBootApplication anatasyonu kullanımı :  Eğer sınıfınızda @Configuration, @EnableAutoConfiguration ve@ComponentScan anatasyonlarını beraber kullanıyorsanız tüm bu
üç anatasyonu karşılıyan @SpringBootApplication anatasyonunu kullanabilirsiniz. Bu şekilde kullanımda  @Configuration ve @EnableAutoConfiguration'ın attribute'larını @SpringBootApplication'da özelleştirebilirisiniz.

package com.example.myproject;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication // same as @Configuration @EnableAutoConfiguration @ComponentScan
public class Application {
 public static void main(String[] args) {
 SpringApplication.run(Application.class, args);
 }
}


Uygulamanızı Çalıştırmak : Burada oluşturduğunuz jar dosyalarınızı çalıştırmaktan bahsedeceğiz. Eğer uygulamanız web uygulaması ise içinde gömülü tomcat olacaktır. Eğer war şeklinde paketlemeyi seçtiyseniz uygulama sunucunuzun war'ı nasıl çalıştırdığına bakmanız gerekmektedir.

Eğer uygulamanızı ide'den çalıştırıyorsanız :

Uygulamanızı maven veya gradle uygulaması olarak import ettikten sonra run as java program şeklinde çalıştırırsınız. Eğer uygulamanız web uygulaması ise ve iki kez kazara çalıştırırsanız port already in use hatası alırsınız.

Paketlenmiş uygulamayı çalıştırıyorsanız :

Eğer uygulamanızı maen veya gradle ile çalıştırılabilir paket haline getirdiyseniz, uygulamanızı  java -jar komutuyla çalıştırabilirsiniz. Öreneğin :
java -jar target/myproject-0.0.1-SNAPSHOT.jar
Aynı şekilde uygulamanızı uzaktanda çalıştırabilirsiniz :
$ java -Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=8000,suspend=n \ -jar target/myproject-0.0.1-SNAPSHOT.jar

Maven plugin'i ile çalıştırmak :
Uygulamanızı paketlemeden maven plugin'i ile de çalıştırabilirsiniz.
$ mvn spring-boot:run 

Gradle ile çalıştırmak :
$ gradle bootRun 

Hot swapping : Spring boot uygulamaları sade Java uygulamaları olduğundan JVM hot-swapping bu noktada etkili oluyor. JVM hot-swapping'in bytecode değişiminde swapping kabiliyetleri sınırlı olduğundan daha derin çözümler için JRebel veya Spring Loaded projeleri bu noktada daha etkili olmaktadır. Ayrıca spring-boot-devtools modülü hızlı uygulama restart'larında destek vermektedir.


Kaynak : https://docs.spring.io/spring-boot/docs/current/reference/pdf/spring-boot-reference.pdf


Glassfish ve Tomcat gibi uygulama sunucularının önünde Apache Web Server'in kullanılma nedenleri nelerdir?

  • Clustering. Apache HTTP server'i ön tarfata kullanmak Apache HTTP server'ı birden fazla Apache Tomcat uygulama sunucusunun önünde bir ön kapı haline getirerek Tomcat'lerin biri çöktüğünde Apache HTTP server'in bu tomcati yoksayarak diğer Tomcat'e geçmesini sağlar ve bu sayede sistem admini gece rahatça uyuyabilir. Bu senaryo donanımsal yük dengeliyi kullanılmışsa veya Tomcat'in clustering kabileyetleri kullanılmışsa göz ardı edilebilir.
  • Clustering/Security. Apache'i ayrıca Tomcat'ler için farklı URL isim uzayları için bir ön kapı olarak kullanabiliriz.(/app1/, /app2/, /app3/, veya virtual host'lar). Tomcat'ler güvenli bir alanda olabilirler ve güvenlik açısından sadece Apache HTTP server ile ilgileniriz. Yani özet olarak Apache akıllı bir proxy sunucu haline gelmiş olur.
  • Güvenlik. Bu konu her iki yöne de değişebilir. Java güvenlik yöneticisine sahipken, Apache daha büyük bir akıl hocalığı ve daha fazla hüner içeriyor. Buna daha ayrıntılı bir şekilde girmeyeceğim, ancak Google'ın arkadaşınız olmasını sağlayın. Senaryonuza bağlı olarak, biri diğerinizden daha iyi olabilir. Ancak unutmayın ki, Tomcat ile Apache'yi çalıştırırsanız - savunmanız gereken iki sisteminiz var, artık bir sisteminiz yok.
  • Eklentiler. CGI, perl'e ekleme yaparken PHP, Apache için çok doğaldır. Apache HTTP'de, istediğiniz zaman bağlanabilen yüzlerce modül vardır. Apache Tomcat de bu yeteneğe sahip olabilir, ancak bunun için kod henüz yazılmamıştır.
  • Dekoratörler! Apache Tomcat'in önündeki Apache HTTP ile, Apache Tomcat'in desteklemediği veya hemen kod desteği bulunmayan herhangi bir sayıda dekoratör gerçekleştirebilirsiniz. Örneğin, Apache Tomcat için modheaders, modrewrite ve mod_alias yazılabilir, ancak neden Apache HTTP bunu çok iyi yaptığında tekerleği yeniden icat edelim?
  • Hız. Apache HTTP, statik içerik sunumunda Apache Tomcat'tan daha hızlıdır. Ancak yüksek trafik alanınız yoksa, bu işe yaramaz. Fakat bazı senaryolarda, Apache Tomcat Apache httpd'den daha hızlı olabilir. Öyleyse sitenizi benchmarklayın. Apache Tomcat, uygun konnektörü kullanırken (sendFile etkinleştirilmiş APR) httpd hızlarında performans gösterebilir. Hız, Apache httpd ve Tomcat arasında seçim yaparken bir faktör olarak düşünülmemelidir.
  • Soket kullanımı / sistem kararlılığı. Apache HTTP, hata koşullarına göre Apache Tomcat'ten daha iyi soket işleme özelliğine sahiptir. Başlıca nedeni, Apache Tomcat'in çapraz platform olması gereken JVM aracılığıyla tüm soket işlemlerini gerçekleştirmesi gerektiğidir. Soket optimizasyonu platforma özgü bir sıkıntı sorunudur. Çoğu zaman Java kodu iyi, ancak aynı zamanda düşen bağlantılar, geçersiz paketler, geçersiz IP'lerden gelen geçersiz istekler ile bombardıman edildiğinde, Apache HTTP bu hata koşullarını JVM tabanlı programdan düşürmede daha iyi bir iş çıkarıyor. (YMMV)

Servlet spesifikasyonunda yer alan Filter ve Listener nelerdir?

Servlet Spesifikasyonu servletler dıişında iki bileşeni daha tanımlar. Bunlar filters (filitreler) ve listeners (dinleyiciler)'dir.
Filtreler (Filters)

Bir filter bir servlet'e, JSP'ye veya statik bir sayfaya istek (request) gönderilirken veya cevap (response) döndürülmeden önce araya girebilen(intercept) bir bileşendir. Bu merkezi görevlerin tüm isteklerden önce ve cevaplardan önce kolayca uygulanmasını sağlar. Bu merkezi görevler kontrol, loglama gibi işlemler olabilir. Filtreler request veya respnse nesnesinin body'sine ve header'ına tam erişim yetkisi vardır, bu şekilde çeşitli transformasyonlar yapabilirler.
Mesela request nesnesinin header'inde istemcinin compressed response kabul ettiğini kontrol ederek response'ın gövdesini compress (sıkıştırma) edebilir.
Bir filtre spesifik bir servlete uygulanabileceği gibi, isteklerin geldiği URL şablonuna uyan elementlere uygulanabilir. Bu şablonlar aynı path'le başlayan elementler olabildiği gibi aynı uzantılara sahip elementler de olabilir. Jason Hunter'ın filtrelerle ilgili makalesine buradan ulaşabilirsiniz. Bu makale çeşitli tiplerdeki filtrelerin nasıl geliştirilebeleceği, işlem zamanını ölçmede filtrelerin kullanımı, click and clickstreams izleme, response compression ve dosya yükleme gibi örenklerle açıklıyor.
Dinleyiciler (Listeners)
Dinleyeciler (Listeners) uygulmanızın belirli olaylara (event) nasıl tepki vereceğine karar veren yapılardır. Servlet spesifikasyonunun 2.3 versiyonu ile beraber servlet context için çeşitli listener tipleri tanımlanmıştır. Session ve request lifecycle eventleri("created" ve "destroyed" eventleri), session attribute eventleri ("added" ve "removed" eventleri), aynı zamanda session aktivasyonu ve pasifizasyonu eventleri(container tarafından kullanılan geçici olarak kaydedilen session durumu veya başka bir sunucuya session'un aktarılması).
Bütün bu listener çeşitleri Java event modelini kullanır. Başka bir ifadeyle bir listener bir veya daha fazla listener interface'ini implemente eden bir sınıftır. Interface eventlere göre metotları tarif eder. Listener sınıfı uygulama başladığında containere kayıt olur ve container event metodlarını eventler oluşunca çalıştırır.
Listener'ler için daha fazla detaya ve örneklere buradan ulaşabilirsiniz.

Milyoner adaylarının 20 alışkanlığı

1. Hayır demeyi bilin
Hayır demeyi öğrendiğinizde okuma,öğrenme,uyuma,arkadaşlarla buluşma gibi aktivitelere ve hayatı sevmeye daha fazla zamanınız kalmış olur.
2. Aşk
Aşk yeryüzündeki tek inançtır. Aşk etrafında toplanılmaya değer tek şeydir. Aşk fikir kaslarınız için ana yakıttır.
3. Hata Yapın
Hatalar başarı kitabının heceleridir. Hataları öğrenmek için sıkı çalışın. Onların sihrini öğrenin. Kaslar yırtıldığında eskisinden daha kuvvetli bir biçimde yenilenilirler.
4. Tohumlar ekin
Temel bahçe matematiği :Tohumların sadece yüzde biri çiçeklere dönüşür. Birçok tohum ekin.
5. Size karşı nazik olan ve sizi seven insanların yanında bulunun
Diğer insanlar sizi mutsuz, sert ve başarısız yapacaktır.
6. Odanın en zeki insanının hemen yanında olun
Harold Raims bunu yaptı. (Bill Murray)

Steve Jobs bunu yaptı. (Steve Wozniok)
Craig Silverstone bunu yaptı. (Kim mi? Larry Page)
Kanye West bunu yaptı.(Jay-Z)
7. Bahane üretmeyin
Suçlamak sizi tüketir. Şikayet etmek sizi tüketir. Sürekli açıklama yapma isteği sizi tüketir. Bu kadar tüketici şey için gerekli iç tesisatımız yoktur.
8. Başarı için acele etmeyin
Uzun vadeli başarıya (20 yıl) giden yolda pek çok küçük başarı elde edersiniz.
9. Şükür sorununuzu çözün
Eğer çamurda elmas bulabilirseniz, hayatta birçok elmasınız olur. Şükretmeyi ve iyi yönlerden bakmayı bilin.
10. Warren Buffet'ın 5/25 kuralı
Hayatta yapmak istediğiniz 25 şeyi sıralayıp yazın. Daha sonra bu listeden en çok istediğiniz 5 taneyi seçin ve uygulamaya başlayın. Diğer 20 şeyi aklınızdan çıkarın, eğer çıkarmazsanız seçtiğiniz 5 şeyi yapmaya gerekli zamanınız ve konsantrasyonunuz kalmaz.
11. Günde bir yere 10 fikir yazın
Görüceksiniz ki bu süper bir güce dönüşecek. Bu işlemi 6 ay boyunca yapın ve ne olduğunu görün.
12. Peşini bırakmayın
Ertesi gün bir yeni bir adım olarak yeni bir fikirle email atın.
13. Sorular sorun
Sorular cevaplardan daha fazladır. Fırsatlar sorularda gizlidir. Gerçekler dış kaynaklı olabilir.
14. Günde %1
Neyde daha iyi olmak istiyorsanız ona günde %1 daha fazla zaman ayırın. Günde %1 bir yılda kümilatif olarak %3800'e tekabül edecektir. Bu şekilde kazanacaksınızdır.
15. Sadece şimdi
Pişmanlık bugünün zamanını dün için boşa harcamaktır. Ve kaygı gelecekten enerji çalmaktır. Şu ana odaklanın.
16. Uyuyun
Uyku, beyin hücrelerini yeniler vücudu iyileşir, endişeyi azaltır. Ve beynin sadece 2-5 saat aktiftir. Tatlı Rüyalar.
17. Her gün ölümden kaçın
Hastane yatağında zengin olamazsınız. Veya bir mezarda. Hergün hareket edin, iyi uyuyun, ve sağlıklı beslenin.
18. Her gün yaparken çocuk gibi sevindiğiniz bir şeyi yapın
Bu genellikle yaşamınız için güç olabilecek bir yakıttır.
Hey bir dakika, 20 alışkanlık demiştiniz.
Başarının anahtarı = Kendinize zaman zaman hata yapma hakkı tanıyın.

Facade (Cephe) Design Pattern

TDK'ya göre cephe : Bir şeyin veya yapının ön tarafta bulunan bölümü Facade design pattern alt sistemlerden oluşmuş bir sistemde kullanıcının (client)'ın bu alt sistemleri bilmeden herbirini yalnız başına veya ortak olarak kullanabileceği arayüzü sağlar. Bir örnekle açıklayalım. Bir bilgisayar ram, hdd, cpu gibi alt sistemlerden oluşur. Bir bilgisayarı başlattığımız zaman bu alt sistemleri harekete geçirirp belli işlemleri yerine getirmesini bekleriz. Fakat kullanıcı bu alt sistemleri tek tek harekete geçirmek yerine kasada var olan start tuşuyla bu alt sistemlerin sırasıyla hepsinin harekete geçmesini bekler. Client bunların sırasını ve neler yaptığını pek bilmek istemez. Burada kasa'ya facade sınıfı diyebiliriz. Kod olarak gösterecek olursak.




/* Facade */

class ComputerFacade {
    private CPU processor;
    private Memory ram;
    private HardDrive hd;

    public ComputerFacade() {
        this.processor = new CPU();
        this.ram = new Memory();
        this.hd = new HardDrive();
    }

    public void start() {
        processor.freeze();
        ram.load(BOOT_ADDRESS, hd.read(BOOT_SECTOR, SECTOR_SIZE));
        processor.jump(BOOT_ADDRESS);
        processor.execute();
    }
}

/* Client */

class You {
    public static void main(String[] args) {
        ComputerFacade computer = new ComputerFacade();
        computer.start();
    }
}
Alt sistemler kendi başlarına sırayla çalışabildiği gibi, birbirleri ile etkileşim halinde olup belli işleri yerine de getirebilirler.

Java 8 Functional Interfaces ve Lambda Kullanımı

Java 8'de tek metoda sahip interface'lere functional interfaceler denir. Bunlar Runable interface'i gibi built in interfaceler olabildiği gibi kendi yazdığımız interface'ler de olabilir.




Java 8 ve öncesinde bir interface'i implemente etmek için bir class yazıp metodlarını override ediyorduk.
public interface SimpleInterface {
     public void doSomething();
}
public class SimpleClass implements SimpleInterface{
     
     @Override
     public void doSomething(){
        System.out.println("doing something");
    }

}
public class Test {
    
    public static void main(String[] args) {
        SimpleClass sipmle=new SimpleClass();
        simple.doSomething()
    }

}
Görüldüğü gibi interface'i implemente eden bir sınıf yazdık ve metodunu kullandık. Eğer inner class kullansaydık :
public class Test {
    
      public static void main(String[] args) {
          SimpleInterface simple= new SimpleInterface(){
          
             @Override
             public void doSomething(){
                 System.out.println("doing something");
             }

          }
         simple.doSomething();
    }

}
şeklinde Class yazmamıza gerek kalmadan interface'i direkt kullanadabilirdik. Java 8'de lamda ile bu daha da kolaylaşıyor. Eğer interface functional interface ise yani tek abstract metoda sahipse : Görüldüğü gibi tek abstract metodlu bir interface. @FunctionalInterface anatosyonu yazma zorunluluğumuz yoktur isteğe bağlıdır.
@FunctionalInterface
public interface SimpleInterface {
    public void doSomething();

}
public class Test {

    public static void main(String[] args) {
        SimpleInterface simple=()->System.out.println("doing something");
        simple.doSomething();    
    }

}
Burada "()" interface'in sahip olduğu tek methodu belirtir. -> ise implementasyonuna işaret eder. Burada implementasyon System.out.println("doing something"); şeklindedir. Bu şekilde functional interface'i class ile implemente etmeye gerek kalmadan metdounu istediğimiz yerde farklı implemnte ederek kullanabiliriz. Aynı durum tek metoda sahip built-in interfacelerde de geçerlidir. Örneğin Runable interface'i :
public class UseRunnable {

    public static void main(String[] args) {

        Runnable r1 = () -> { 
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("Running Thread 1");
        };
        Runnable r2 = () -> System.out.println("Running Thread 2");

        new Thread(r1).start();
        new Thread(r2).start();

    }

}

Rastgele İçerik

DonanımHaber

© tüm hakları saklıdır
made with by templateszoo