Herşey ilk adımlarla başlar...

Tuesday, September 25, 2018

How to run RabbitMQ on Docker and connect with Spring Boot

RabbitMQ is a widely used messaging broker. If you don't have any experience in messaging queues it may seem complicated but believe me it is not.

Now we'll focus on how to run RabbitMQ on a Docker container and then connect with a spring boot application.

  • Step 1 - Installation of Docker
  • Step 2 - Running RabbitMQ on Docker
  • Step 3 - Spring Boot application 


 Let's start with the Docker

Step 1 - Installation of Docker

Download the docker --> https://store.docker.com/editions/community/docker-ce-desktop-mac

Double-click the dmg file

Drag&Drop 
That's it! 


Step 2 - Running RabbitMQ on Docker

Create a docker-compose.yml file

Define the base image and define the ports
rabbitmq:
  image: rabbitmq:management
  ports:
    - "5672:5672"
    - "15672:15672"
And then just run the below command in the terminal at the same folder with the file (docker-compose.yml)
docker-compose up
This will download and run the RabbitMQ image on the docker. After the download finishes, we may check the management console
http://localhost:15672/#/
You may login with
guest
guest
If you are seeing something similar to this, it means now you have you rabbitmq running on your docker instance.


That's it!

Step 3 - Spring Boot application with RabbitMQ

Create a Spring Boot application, here is the pom.xml for it 
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>
<groupId>com.nurettin</groupId>
<artifactId>Spring-RabbitMQ</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>Spring-RabbitMQ</name>
<description>project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.5.RELEASE</version>
<relativePath /> 
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.7.0</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.7.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
Application class, here we have listener, binding and our beans
package com.nurettin;



import org.springframework.amqp.core.Binding;

import org.springframework.amqp.core.BindingBuilder;

import org.springframework.amqp.core.Queue;

import org.springframework.amqp.core.TopicExchange;

import org.springframework.amqp.rabbit.connection.ConnectionFactory;

import org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer;

import org.springframework.amqp.rabbit.listener.adapter.MessageListenerAdapter;

import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;

import org.springframework.context.annotation.Bean;



import com.nurettin.mq.Receiver;



@SpringBootApplication

public class SpringRabbitMqApplication {



 public static final String topicExchangeName = "spring-boot-exchange";



    static final String queueName = "spring-boot";



    @Bean

    Queue queue() {

        return new Queue(queueName, false);

    }



    @Bean

    TopicExchange exchange() {

        return new TopicExchange(topicExchangeName);

    }



    @Bean

    Binding binding(Queue queue, TopicExchange exchange) {

        return BindingBuilder.bind(queue).to(exchange).with("foo.bar.#");

    }



    @Bean

    SimpleMessageListenerContainer container(ConnectionFactory connectionFactory,

            MessageListenerAdapter listenerAdapter) {

        SimpleMessageListenerContainer container = new SimpleMessageListenerContainer();

        container.setConnectionFactory(connectionFactory);

        container.setQueueNames(queueName);

        container.setMessageListener(listenerAdapter);

        return container;

    }



    @Bean

    MessageListenerAdapter listenerAdapter(Receiver receiver) {

        return new MessageListenerAdapter(receiver, "receiveMessage");

    }



 public static void main(String[] args) {

  SpringApplication.run(SpringRabbitMqApplication.class, args);

 }



}


Receiver class
package com.nurettin.mq;



import java.util.concurrent.CountDownLatch;



import org.springframework.stereotype.Component;



@Component

public class Receiver {



    private CountDownLatch latch = new CountDownLatch(1);



    public void receiveMessage(String message) {

        System.out.println("Received <" + message + ">");

        latch.countDown();

    }



    public CountDownLatch getLatch() {

        return latch;

    }



}


Controller 
package com.nurettin.controller;



import java.util.concurrent.TimeUnit;



import javax.validation.Valid;



import org.springframework.amqp.rabbit.core.RabbitTemplate;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.web.bind.annotation.PostMapping;

import org.springframework.web.bind.annotation.RequestBody;

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



import com.nurettin.SpringRabbitMqApplication;

import com.nurettin.mq.Receiver;



@RestController

public class MessageController {



 @Autowired

 private RabbitTemplate rabbitTemplate;

 @Autowired

 private Receiver receiver;



 @PostMapping("/messages")

 public String sendMessage(@Valid @RequestBody String message) {



  rabbitTemplate.convertAndSend(SpringRabbitMqApplication.topicExchangeName, "foo.bar.baz", message);

  try {

   receiver.getLatch().await(10000, TimeUnit.MILLISECONDS);

  } catch (InterruptedException e) {

   e.printStackTrace();

  }



  return "Message added to the queue : " + message;

 }



}


Config for the Swagger ( Never skip swagger)
package com.nurettin.config;



import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;



import springfox.documentation.builders.PathSelectors;

import springfox.documentation.builders.RequestHandlerSelectors;

import springfox.documentation.spi.DocumentationType;

import springfox.documentation.spring.web.plugins.Docket;

import springfox.documentation.swagger2.annotations.EnableSwagger2;



@Configuration

@EnableSwagger2

public class SwaggerConfig {                                    

    @Bean

    public Docket api() { 

        return new Docket(DocumentationType.SWAGGER_2)  

          .select()                                  

          .apis(RequestHandlerSelectors.any())              

          .paths(PathSelectors.any())                          

          .build();                                           

    }

}

Run your application! 

You may use "postman" or Swagger to try your Rest API 
http://localhost:8080/swagger-ui.html
You may see our message controller. Just expand it, write down your message and try out! 



That's it! 

Congratulations now you are running your spring boot application which is connected to the RabbitMQ ( on Docker). 

Sunday, October 23, 2016

Docker nedir ve neden heyecanlanmamız lazım?




Merhabalar, bu yazıyla birlikte
  • Docker'ın ne olduğunu öğrenecek..
  • Docker'ın nasıl çalıştığını anlayacak.. 
  • Hangi problemlere çözüm getirdiğini kavrayacak..
Ve kendi projelerinizde Docker kullanarak nasıl bir fayda sağlayabileceğinizi düşünmeye başlayacaksınız.

O zaman başlayalım;

Docker Nedir?

Docker, uygulamalarınızı geliştirmek, taşımak ve çalıştırmak için tasarlanmış harika bir sanallaştırma çözümüdür. 

Peki onu harika kılan ve diğer sanallaştırma çözümlerinden ayıran nedir? 

Docker, diğer sanallaştırma çözümleri gibi tüm bir işletim sistemi ve üzerindeki her şeyi hedef almak yerine sadece uygulamaları baş köşeye oturtur ve onları tek başlarına çalışabilecekleri ve tamamen kendilerine ait olan Konteyner'lerde çalıştırır. İşte Docker'ı harika kılan yegane nokta budur. İşi sanallaştırmadan çıkarıp yeni bir kategoriye taşımış ve konteynerleştirme platformu olarak tahtına oturmuştur. Docker.com'daki tanımlama da bize direkt olarak bunu söylemektedir.
Docker is the world's leading software containerization platform.
Peki konteynerleştirme neden önemlidir?

Bu soruya cevap verebilmek için biraz eskilere gitmemiz gerekiyor... 1950'lere..

1951 yılının nisan ayında dönemin önde gelen ülkeleri bir araya gelerek standart bir konteyner kavramı üzerinde fikir birliğine varmıştır. 



Aslında çok basit görünen bu standartları tanımlanmış metal kutucuk sayesinde lojistik endüstrisi ivmeli bir büyüme kazanmıştır. O ana kadar şu sorular ve problemler ile kıvranırken;

  • Taşımak istediğim kahve çekirdekleri, aynı gemideki piyanolar altında ezilip bozulacak mı? 
    • (Ürünüm taşıma esnasında başka bir üründen etkilenecek mi? )
  • Özenle hazırladığım ve kontrol ettiğim kahve çuvallarını gemiye yüklemeye çalışırken yeni bir araca ihtiyacım olacak mı? 
    • (Her farklı ürün için yeni bir yükleme aracına mı ihtiyac duyacağım)
  • Ya çuvallardan birisi farklı bir ürün grubu ile karışır da teslim edilmesi gereken sayıda ürün yerine ulaşmazsa?
    • (Üretim ortamım ile teslim ortamım arasında fark çıkarsa)
Konteynerler sayesinde bunların hepsi çözüme kavuşmuş oldu. Artık kişilerin yapması gereken tek şey, boyutları ve standartları herkes tarafından bilinen bu metal yığınlarının içine kendi ürünlerini istedikleri gibi yerleştirmek. Bundan sonrası zaten herkes tarafından kabul görmüş olan şekilde yüklenecek, taşınacak ve teslim edilecektir.

Separation of Concerns (SoC) 'e uygun olarak, taşınması istenen konteynerin kapağı kapatıldıktan sonra bütün endişeler uzaklaşmış olur. Bundan sonrası zaten standartlaştırılmış olan ve içerikten bağımsız olarak otomatize edilmiş bir süreç olan konteyner taşınmasıdır.

İşte Docker da aynı yolu izlemektedir. 

Sizler için uygulamalarınıza özel bir ortam sağlıyor ve bunu sanal makinalar gibi hantal ve çok kaynak tüketen bir yapıyla değil, hızlı ve az kaynak ile çalışan "Container" özelliği ile sunuyor.

Sanal makinalar her seferinde adeta yeni bir gemiye ihtiyaç duyarcasına yeni bir işletim sistemi kurulumuna ihtiyaç duyarlar. Docker ise uygulamaları container'lar içerisinde çalıştırarak uygulamanın işletim sistemini tamamen kendine ayrılmış olarak görmesini sağlar.

Peki Docker bunu nasıl yapar?

Docker, Linux 'un 2008 yılında tanıttığı ve Linux Kernel'e eklediği Linux Containers (LXC)  yapısı üzerine kurulmuştur. LXC, her bir container'a kendisine ait ortam değişkenleri, kök dizini ve benzeri fonksiyonlar sunarak container'daki processlerin tüm işletim sisteminde tek başlarına çalıştıkları izlenimi veren bir sanallaştırma sağlar. LXC için daha detaylı bilgiye şuradan ulaşabilirsiniz.

Docker da bu teknolojiden faydalanarak guest işletim sistemi ihtiyacını ortadan kaldırır. Diğer sanallaştırma çözümleri asıl makinada bulunan "Host Operating System" üzerinde çalışan "Guest" işletim sistemlerine ihtiyaç duyarken 


Docker ise aynı yalıtılmış ortamı direk olarak "Host" işletim sistemi üzerinden sunar.


Bu sayede "Guest" işletim sisteminin ihtiyaç duyduğu tüm sistem kaynakları, el değmemiş olarak, yeni container'ların kullanımına açıktır. Çok basit bir hesap ile 10 tane sanal makina için 2'şer GB 'dan 20 GB RAM ve 6'şar GB'dan 60GB kadar disk kaynağından tasarruf edilmiştir.

Docker, sizlere bir sanal makinanın sağladığı tüm faydaları sağlar ve bunları hem en az maliyetle (sistem kaynağı) yapar hem de hayranlık uyandırıcı bir basitlikle sunar.

Linux Container teknolojisinden bahsetmem yanlış bir algı uyandırmasın. Docker hem Linux hem Windows hem de MacOs işletim sistemlerinde çalışabilir. Windows'ta bu özelliği sunabilmek için boot2docker isminde özelleşmiş ve çok minimalist (aşağı yukarı 25 MB olan) bir linux dağıtımından faydalanırken kısa bir süre önce Microsoft'un da desteğini alarak (şu an için sadece Windows 10 'da olsa da) bu ihtiyacı ortadan kaldırdı. Microsoft Hyper-V ile entegre çalışarak Windows dünyasındaki yerini de sağlamlaştırmış oldu.  Aldığı bu destek, önümüzdeki dönemde Docker'ı ve container'larını daha çok duyacağımızın bir kanıtı diyebiliriz.

Docker 'ın çalışma mantığını biraz daha detaylandıracak olursak

Bahsettiğimiz Container'ların yönetim merkezi Docker Daemon'dır. Daemon, docker objelerini yaratır ve onları yönetir. Bunlar image, container, network ve veri kaynaklarıdır. Daemon'a komutlar vermek için kullandığımız arayüz docker CLI (command line interface)'dir. Docker yapısına bakarsak aşağıdaki gibi tasarım ile karşılaşırız


CLI ve  daemon ile REST API üzerinden haberleşirler. CLI direk olarak komutlarla veya önceden tanımlanmış scriptler ile daemonun ne yapması gerektiğini söyleyebilir. Hangi container'ın ne zaman çalışıp ne zaman duracağı, çalışma esnasında nasıl davranacağı, hangi image'in bir container haline geleceği ve benzeri komutlar daemon'a bu şekilde iletilir. İsmi geçen kavramları kısaca özetlersek;

Docker Daemon

İşletim sistemi üzerinde çalışan, docker yönetim merkezidir.  Docker objelerini yaratır ve yönetir.

Docker CLI

Kullanıcının Docker Daemon ile iletişim kurmasını sağlayan arayüzdür. Kullanıcıdan aldığı komutları rest api aracılığıyla daemon'a iletir.

Docker Image

Container'ların file system üzerindeki halidir. Image'leri container yaratmak için gereken talimatların bulunduğu bir şablon olarak düşünebiliriz. Örneğin bir docker image nginx sunucusu veyahut mysql veritabanı içerebilir. Image'lerin en güçlü özelliklerinden birisi de başka bir image baz alınarak yaratılıp kişinin isteklerine göre değiştirilebilmesi ve son şekliyle yeniden paketlenebilmesidir.

Docker Image'leri text formatında olan bir Dockerfile ile tanımlanır.

Docker Container

Docker container ise bir image'in çalışan halidir. Dockerfile ile tanımlanmış olan Docker image alır ve basit komutlarla daemon tarafından çalıştırılmasını sağlarız ve böylece container'ımız hazırlanmış olur. Aynı sanal makinalarda olduğu gibi bir container'ı duraklatabilir (pause) veya tamamen durdurabiliriz (stop), bu da bize esneklik sağlar.

Docker'ın temel bileşenlerini tanımış olduk. Docker 1.12 ile gelen başka bir bileşen ise Docker Service'dir. Docker Service ise bir docker image'inin istenilen sayıda kopyasının aynı anda çalıştırılması ile elde edilir. Kullanıcı tarafından bakıldığında sadece bir uygulama çalışıyor gibi görünse de arka tarafta bir çok container paralel olarak çalışır ve bunların arasındaki yük Swarm Manager tarafından eşit olarak dağıtılır. Bu sayede ihtiyaç anında çok kolay bir şekilde mevcut uygulamamızı ölçeklendirebilir ve bunu çalışırlığından emin olduğumuz image'imizi kullanarak yapabiliriz. 

Ve gelgelelim... 

Docker gerçekten çok güçlü bir platform olmasındaki en büyük etkenlerden birine.. Benim de Docker Platformunun belki de en beğendiğim özelliğine.. 

Docker Registry

Docker registry, imagelerin tutulduğu ve dağıtıldığı bir ortamdır. Aynı Github'da olduğu gibi elimideki image'leri docker registry'sine push edebilir veya daha önceden yüklenmiş olan bir image'i pull edebiliriz. Bu sayede ihtiyaçlarınızı karşılayacak bir image'e çok hızlı bir şekilde erişebilir, gerekirse üzerinde değişiklik yapabilir ve tag'leyerek farklı bir version olarak yeniden gönderebiliriz.

Bu yapı o kadar güzel işlemekte ve fayda sağlamaktadır ki onlarca sektör lideri şu anda DockerHub üzerinde kendi image'lerini sunmaktadırlar. İlk akla gelenler; nginx, redis, ubuntu, mongodb, mysql, wordpress, elastic search, tomcat, java, jenkins, python ve daha niceleri... Sadece bu saydıklarımın her biri şu an 10 milyonun üzerinde pull isteği almış durumdadır!

Platformun genelini daha iyi canlandırabilmek için aşağıdaki görseli de eklemekte yarar var



Docker Hangi problemlere çözüm getiriyor?

Docker 'ın çözüm getirdiği başlıca sorunları şu şekilde sıralayabiliriz

Benim makinemde çalışıyor...

Eğer yazılım sektöründeyseniz bu cümleyi mutlaka duymuşsunuzdur. Yazılımı geliştiren kişi, ilgili uygulamayı kendi laptopunda çalıştırmış, stabil bir şekilde çalıştığını görmüş ve diğer geliştirmelerine doğru çoktan yola koyulmuştur bile.. O sırada bir testçi aynı uygulamayı kendi laptopunda denediğinde ise uygulamanın çalışmadığını görmüştür.

Peki şimdi suç kimdedir ve bu problemi kimin çözmesi gerekmektedir? Yazılımcı uygulamanın kendi makinesinde çalıştığını kanıtlamakta, testçi ise aynı uygulamanın kendi makinasında çalışmadığını kanıtlamaktadır :)
Yaşanan problem elbette bahsedilen farklı makinelerin farklı konfigurasyonlarından kaynaklanmaktadır. Belki uygulamanın ihtiyaç duyduğu bir dosya A makinasında bulunmakta ama B makinasında bulunmamakta belki de B makinasında kullanılan x bir program çalıştırılmak istenen uygulamayı engellemektedir.

Docker, uygulamaları tamamen izole olmuş bir ortamda (kendi container'ında) çalıştırdığı ve ayrıca bu izole ortam Docker image olarak bütünüyle taşındığı için A makinasında çalışan bir uygulamanın B makinasında da aynı şekilde çalışacağını garantilemiş olur.

Uzun deployment süreleri ve buna bağlı yaşanan sistem kesintileri...

Fiziksel bir makinanın kapatılması ve ardından yeniden başlatılması dakikalar sürmekteyken aynı işlevi gören bir Docker container'ın kapatılması ve yeniden başlatılması milisaniyeler seviyesindedir. Bu da sistem yöneticilerinin en büyük sorunlarından biri olan "deploy nedeniyle hizmet kesintileri" sorunsalını tamamen gündem dışı bir konu haline getirir.

Artık istenildiği anda mevcutta çalışan bir Docker container durdurulabilir, kapatılabilir ve milisaniyelerle ölçülen sürelerde yeni bir container başlatılabilir. Uygulamalar üzerinde yapılan değişiklikler bu sayede çok hızlı bir şekilde kullanıma alınabilir.

Değerli sistem kaynaklarının işletim sistemleri tarafından tüketilmesi..

Artık bir çok organizasyon sanal makinaların sunduğu faydalardan yararlanabilmek için sistemlerini sanallaştırma yoluna gitmektedir. Hepimizin bir şekilde dokunmuş olduğu bulut teknolojileri de sanallaştırmanın en çok kullanıldığı alanların başında gelir.

Sanal makinalar esnek ve birçok fayda sağlasa da her yeni makina üzerinde kendine ait bir işletim sistemi olma zorunluluğu nedeniyle çok fazla sistem kaynağına ihtiyaç duyulmaktadır.

Docker ise çalıştıracağı uygulamalar için ayrı birer işletim sistemi kullanmadığı için aynı senaryoda kurgulandığında çok az kaynakla çok iş yapabilmektedir. Ve bu sayede boşa çıkan değerli sistem kaynakları başka bir hizmet için kullanılabilir hale gelmektedir.

Evet, artık Docker Nedir? biliyorsunuz, temel kavramı öğrendiniz ve çözüm getirilen başlıca problemleri gördünüz. Tebrikler, böylelikle son zamanların en gözde altyapı platformu Docker'ı tanımış oldunuz!

Umarım hepinize faydalı olmuştur.


Monday, July 15, 2013

Gmail'de imzaya resim eklemek.

7/15/2013 Posted by Nurettin Onur YAKIT 3 comments



Merhabalar,

Google'ın gmail servisinden yararlanıyorsanız ve imza'nıza resim eklemek istiyorsanız bu yazıyı okuyun.

Öncelikle  mailinize login olun. 

Ardından sağ üst köşede bulunan "çark" işaretinden settings'i seçin.




İşlemlerimizi "General" sekmesinde gerçekleştireceğiz.



Sayfanın biraz aşağılarında "Signature" ile ilgili kısma gelin, buradan image icon'una tıklayarak resim ekleyin.


Sizden url soracaktır. Bu url'e eklemek istediğiniz resmin internetten erişilen linkini yazın.



Ok dedikten sonra imzanızda artık bu resim görünür olacak. Eğer ki imzanızda daha önceden yazılı bir şeyler varsa bunları silip. Resmin de güzel görünmesi için large olarak seçim yapabilirsiniz.


Resmin üzerine tıkladıktan sonra çıkan size bilgilerinden Large seçebilirsiniz.

İşlemler bittikten sonra değişikliklerimizi save edelim. 



İşte bu kadar. Artık mail imzanızda istediğiniz resim görünecektir.



Duplicate Finder

7/15/2013 Posted by Nurettin Onur YAKIT No comments
Bir kaç tane jar'ınız var.. Ve bunların içinde aynı class olup olmadığını kontrol etmek istiyorsunuz..

#!/bin/bash
if [ $# -ne 2]
then
    echo "usage is $0 "
else
    FOLDER=$1
    THING_TO_LOOKFOR=$2
    find $FOLDER -iname \*.jar | while read f ; do echo $f && (jar tvf $f | grep -i $THING_TO_LOOKFOR) ; done
fi



Çalıştırmak için ;


./duplicate.sh . tr.com.deneme.User.class

Friday, June 28, 2013

Veritabanı tablosunda kendi içinde bağlantı

6/28/2013 Posted by Nurettin Onur YAKIT No comments



Bir veritabanı tablonuz var ve bu tablo kendi içinde bağlantıya sahip. Örneğin ;

Tablomuz kategori olsun. Bu kategori tablosundaki her kayıt bir başka kategorinin altında kaydedilebilir olsun....

KODU - UST_KATEGORI_KODU
452 - null
453 - 452
251 - 452
212 - 251
202 - 212



SELECT * FROM KATEGORI START WITH KODU= 452

CONNECT BY PRIOR KODU = UST_KATEGORI_KODU


Bu şekilde 452 'ye bağlı olan kayıtların hepsini listelemiş olacaksınız. Sonuç listesinde tüm kodları almış olacaksınız.

Tuesday, March 19, 2013

ZK Framework ve Hibernate Kullanarak database 'e kayıt işlemi yapmak



Merhabalar,

ZK Framework'ü duymuşsunuzdur. Eğer ki duymadıysanız buradan bakabilirsiniz :

http://www.zkoss.org/

Bu framework ile hızlıca AJAX Enabled application'lar yazabilir ve arka tarafta java'nın (J2EE) esnekliğinden ve gücünden faydalanabilirsiniz.

Bununla ilgili bir eğitim videosu hazırladım :


Her hangi bir soru için rahatlıkla comment bırakabilirsiniz.

İyi seyirler.

Monday, December 24, 2012

MySQL iki schema arasındaki tablo farklarını bulmak

12/24/2012 Posted by Nurettin Onur YAKIT , , , , , No comments

MySQL veritabanı kullanıyorsunuz ve iki farklı schema arasındaki tablo farklarını bulmak ve otomatik olarak silmek istiyorsunuz. Ama nasıl ? Buyurun örnek : 

use information_schema;
SELECT CONCAT("DROP TABLE `",
TABLE_NAME, "` ;" )
as MySQLCMD FROM `TABLES` WHERE TABLE_SCHEMA LIKE 'birinci_schema_adi'  and table_name not in (
SELECT
TABLE_NAME
 FROM `TABLES` WHERE TABLE_SCHEMA LIKE 'ikinci_schema_adi'
);
 Bu SQL sizlere iki schema arasındaki tabloların isimlerini ve silmek için DROP querysini verecektir. Bundan sonra yapmanız gereken tek şey sonucumuzu çalıştırmak.