Weblogic Instancelarını Windows Servisine Dönüştürmek

Weblogic Server Konsoluna erişebilmek ve bu konsol üzerinden işlemler yapabilmek için Admin Server ‘ın çalışır durumda olması gerekmektedir. Weblogic kurulumunda Admin Server windows servisi halinde olmadığı için start/stop scriptlerini kullanarak işlem yapabilmekteyiz. Ancak bu durumda Admin Server’ı açan session kill olduğunda Admin Server da direk olarak stop duruma geçmektedir. Linux/Unix gibi işletim sistemlerinde bu tarz scriptlerin session bağımsız olarak çalıştırılabilmesi nohup ile mümkündür ancak Windows işletim sisteminde bu tarz bir işlem mevcut değildir. Bunun için Admin Server ‘ a ve gerekirse diğer Managed Server’lara ait Windows servisi yaratarak bu uygulamaların session bağımsız çalışmalarını sağlayabiliriz.

A. Admin server’ın Windows Servisi Haline dönüştürülmesi:

1. Domain home dizinine gidin. C:\oracle\Middleware\user_projects\domains\base_domain

2. Bu dizine bir tane command scripti oluşturun. Ben adını “InstallAdminServerSvc.cmd” olarak verdim ama anlaşılır olabilecek şekilde herhangi bir isim verebilirisiniz.

3. Bu scriptin içini aşağıdaki şekilde kendi değerlerinize göre güncelleyerek editleyelim:

echo off
SETLOCAL
set DOMAIN_NAME=base_domain
set USERDOMAIN_HOME=C:\Oracle\Middleware\user_projects\domains\base_domain
set SERVER_NAME=AdminServer
set WL_HOME=C:\Oracle\Middleware\wlserver_10.3
set WLS_USER=weblogic
set WLS_PW=welcome123
set PRODUCTION_MODE=true
set JAVA_VENDOR=Oracle
set JAVA_HOME=C:\Oracle\Middleware\jrockit_160_17_R28.0.0-679
set MEM_ARGS=-Xms128m -Xmx256m
call "%WL_HOME%\server\bin\installSvc.cmd"
ENDLOCAL

4. Daha sonra bu scripti komut satırından bulunduğu dizine giderek çalıştırdığınızda "beasvc base_domain_AdminServer installed" sonucunu göreceksiniz.

Not: Komut Satırını açarken mouse ile sağ tıklayıp yönetici olarak çalıştırmalısınız. Zira “Permission denided” hatası alabilirsiniz.

5. Şimdi yaratmış olduğunuz servisi HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services altından kontrol edebilirsiniz.

6. Aynı zamanda services.msc ‘den de servisi kontrol edebilirsiniz.




7. Komut satırından şu şekilde servisin başarılı bir şekilde yüklenmiş olduğunu gerçekleyebilirsiniz:

set WL_HOME=C:\Oracle\Middleware\wlserver_10.3
set PATH=WL_HOME\server\bin;%PATH%

cd C:\Oracle\Middleware\wlserver_10.3\server\bin
beasvc -debug "beasvc base_domain_AdminServer"

8. İsterseniz services.msc den isterseniz de aşağıdaki komutlar ile bu servisi start/stop edebilirsiniz.

Servisi başlatmak:
net start "beasvc base_domain_AdminServer"
Servisi durdurmak:
net stop "beasvc base_domain_AdminServer"

B. Managed Server ‘ın Windows Servisi Haline Dönüştürülmesi:

1. Domain home dizinine gidin.

C:\oracle\Middleware\user_projects\domains\base_domain

2. Bu dizine bir tane command scripti oluşturun. Birden fazla managed server olableceği için “InstallManagedServerCRMSvc.cmd” gibi hangi managed server a ait olduğunu belirtmekte fayda var.

3. Bu scriptin içini aşağıdaki şekilde kendi değerlerinize göre güncelleyerek editleyelim: Burada yukardaki scriptte ek olarak Admin Url i belirtiyoruz.

echo off
SETLOCAL
set DOMAIN_NAME=base_domain
set USERDOMAIN_HOME=C:\Oracle\Middleware\user_projects\domains\base_domain
set SERVER_NAME=CRM
set WL_HOME=C:\Oracle\Middleware\wlserver_10.3
set WLS_USER=weblogic
set WLS_PW=welcome123
set PRODUCTION_MODE=true
set JAVA_VENDOR=Oracle
set JAVA_HOME=C:\Oracle\Middleware\jrockit_160_17_R28.0.0-679
set ADMIN_URL=http://localhost:7001
set MEM_ARGS=-Xms128m -Xmx256m
call "%WL_HOME%\server\bin\installSvc.cmd"
ENDLOCAL

Not: Burada eğer ADMIN_URL belirtilmezse managed server start olmaz ve managed server loglarında aşağıdaki hatayı görürsünüz:

javax.naming.ServiceUnavailableException [Root exception is java.rmi.NoSuchObjectException: The object identified by: '31' could not be found. Either it was has not been exported or it has been collected by the distributed garbage collector.]

4. Daha sonra bu scripti komut satırından bulunduğu dizine giderek çalıştırdığınızda "beasvc base_domain_CRM installed" sonucunu göreceksiniz.

5. Şimdi yaratmış olduğunuz servisi HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services altından kontrol edebilirsiniz.

6. Aynı zamanda services.msc ‘den de servisi kontrol edebilirsiniz.

7. Komut satırından şu şekilde servisin başarılı bir şekilde yüklenmiş olduğunu gerçekleyebilirsiniz:

set WL_HOME=C:\Oracle\Middleware\wlserver_10.3
set PATH=WL_HOME\server\bin;%PATH%

cd C:\Oracle\Middleware\wlserver_10.3\server\bin
beasvc -debug "beasvc base_domain_CRM"

8. İsterseniz services.msc 'den isterseniz de aşağıdaki komutlar ile bu servisi start/stop edebilirsiniz.

Servisi başlatmak:
net start "beasvc base_domain_CRM"
Servisi durdurmak:
net stop "beasvc base_domain_CRM"

C. Servisin Uninstall Edilmesi:

1. Yukardaki adımlara benzer şekilde domain home dizininde “UninstallAdminServerSvc.cmd” command scriptinin içini aşağıdaki şekilde editliyoruz:

echo off
SETLOCAL
set DOMAIN_NAME=base_domain
set SERVER_NAME=AdminServer
set WL_HOME=C:\Oracle\Middleware\wlserver_10.3
call "%WL_HOME%\server\bin\uninstallSvc.cmd"
ENDLOCAL

Ya da

sc delete "beasvc base_domain_AdminServer"  ile servisi silebilirsiniz.

2. Managed server servisinin uninstall edilmesi için de benzer adımları uygulayabilirsiniz.

Not: Aşağıdaki Oracle dökümanından detaylı bilgiye ulaşabilirsiniz:

http://download.oracle.com/docs/cd/E12840_01/wls/docs103/server_start/winservice.html




ESOGÜ Bilişim Günleri 2010



Bu yıl 2. si düzenlenecek olan ESOGÜ Bilişim Günleri 14-15-16 Mayıs tarihlerinde ESOGÜ Kongre merkezinde gerçekleşecek. Benim de organizasyon komitesi başkanlığını yürüttüğüm  35 kişilik bir organizasyon ekibi ile çok başarılı olacağını umduğumuz bir etkinlik olacak.

Etkinliğe katılımı kesinleşen konuşmacılar ve konuları ise şöyle:



  • Semih OMURTAK Ürün Geliştime  Grup Müdürü –SAVRONİK A.Ş. “Arge”
  • Dr. Faruk YARMAN- HAVELSAN A.Ş. Genel Müdürü
  • Sibel TEKİN- ERICSSON HR Generalist “İnsan Kaynakları ve İşe Alım Süreçleri”
  • Av. Barış GÜNAYDIN, Çağlar ULKUDERNER ( EMO)  “Bilişim Hukuku”
  • Office 2010 ve Visual Studio 2010 Lansmanı- MICROSOFT
  • Cenk TEZCAN “Tıp ve Bilişim”-INTEL
  • Berkan USLU , Ali Murat SÜMEN –  “Boğaz Harbi Oyunu : Kara  Savaşları Beta Tanıtımı”
  • PARDUS-ÇOMÜ 64 Bit Pardus  Geliştiricileri“64 Bit Pardus”
  • Semen CİRİT, Bahadır KANDEMİR,  Gökmen GÖKSEL – Tübitak UEKAE  “PARDUS nedir?”
  • Semen CİRİT, Bahadır KANDEMİR,  Gökmen GÖKSEL – Tübitak UEKAE  “Nasıl PARDUS Geliştiricisi Olunur?”
  • Ali IŞINGÖR ,Gizem BELEN –  PARDUS özgürlükiçin.com  “Özgürlük için Topluluk Süreçleri”

Bunların dışında oturumu kesinleşmek üzere olan bir konuşmacımız daha olacaktır.
Etkinlik hakkındaki detaylı bilgiye  www.esogubilisimgunleri.com adresinden erişebilirsiniz.

AYAKLARIM ÇALINDI HÜKÜMSÜZDÜR! “Akülü Tekerlekli Sandalye”

AYAKLARIM ÇALINDI HÜKÜMSÜZDÜR! !
“Akülü Tekerlekli Sandalye”


Sizin hiç ayaklarınız çalındı mı? Benim üç defa çalındı.
Bu sabah kalktığımda her zamanki gibi hazırlıklarımı yaptım ve işe gitmek için kapıyı açtığımda ayaklarım yerinde yoktu. İşe gitmek zorundaydım ve korkunç bir panik içindeydim, otobüsümü kaçırıp da geç kalmıyorum ki bunu daha nasıl tarif etmem gerekiyor. Oysaki daha iki ay önce yine aynı şeyleri aynı duyguları yaşıyordum ben. Ama en tramvatik olanını ben ta çocukluğumda yaşamıştım.

Fark ettiğimde önce panikledim nasıl olurdu annem sağa baktı sola baktı dışarı baktı ama gerçekten yoktu. Kalbim duracak gibi atıyor beynim zonkluyordu. Bir insanın ayakları neden çalınır ki? Ağlamaya başladım bu üçüncüydü ve sanırım hep ben yaşıyordum. Anlatılacak gibi değil. İnsanın ayakları onun umudu sevinci yaşamla arasındaki köprü! Bunu kim koparmak isteyebilir ki? Anlatamıyor anlam veremiyorum. Dahası sabahtan beri ağlamaktan doğru düşünemiyordum. Bu umutlarımın kaçıncı çalınmasıydı. Nasıl mı?

Polisi aradım; ve geldi. Ayaklarımın bana ait olup olmadığına dair bir ispat, bir belge istedi. Ben yerimden kalkamadığım için annem odamdan “ayaklarımın markasını gösteren gerekli belgeyi” ve daha iki ay önce çalınan önceki ayaklarıma ait zapta geçen “Şikayetçi Tutanağını” getirdi. Polis ilgili belgeler ile birlikte annemi ifadesini almak üzere karakola götürdü.

Annem -“Yavrum çocuğumun iki ay önce bir akülü tekerlekli sandalyesi çalınmıştı, bu da tarafınızdan tutulan tutanağı. Siz daha onu bulamadan: Bu sabah uyandığımızda ise kızımın ikinci akülü tekerlekli sandalyesinin de çalındığını gördük. Allah aşkına biz ne yapalım bize bir çare.” Dedi.
Polis -“Umutsuzca inşallah buluruz ama giden gitmiş teyzem.” dedi.

Böyle ulvi bir milletin evlatları nasıl bu kadar bencilce davranabilmişlerdi. Cahilliği affedebilir ve anlayabilirdim ama bencilliği asla. Bu yaşadığım kabusu benimle birlikte paylaşan ulusumun vicdanına havale ediyorum. Yazıklar olsun! ! !

Not:
1. Akülü tekerlekli sandalyemin çalınmasını belgeleyen tutanak tarihi ve markası:
21.02.2010-MEYRA
2. Akülü tekerlekli sandalyemin çalınmasını belgeleyen tutanak tarihi ve markası:
05.04.2010-BELMO

İrtibat: Nurten AKTAŞ
Olay yeri(Adres) : Balkiraz Mah.
Şikayet: Demirlibahçe Karakolu MAMAK / ANKARA

Nurten Aktaş

Not: Nurten Aktaş' a ait diğer yazı ve şiirlere buradan erişebilirsiniz.

Varlık-İlişki (ER) Diyagramları

Readmee nisan sayısı için yazmış olduğum Varlık-İlişki (ER) Diyagramları adlı makalede ER Diyagramlarının ne olduğuna, bu diyagramın çizilmesi için gereken temel kavramlara ve tüm bu anlatılanların detaylı bir örneğine erişmek için tıklayın.


Readmee 1 Yaşında


Readmee'nin bu(Nisan 2010) sayısı hem benim hem de ekibimiz için çok büyük önem taşımaktadır. İlk sayısından beri çok emek vererek bu günlere getirdiğimiz  Readmee artık 1 yaşında. Doğuşunu, adını koyuşumuzu dün gibi hatırlıyorum. Şimdi ise 100 makele ile besledik, büyüttük ve 1 yaşına getirdik.
Yoğun dönemlerimiz oldu, sınavlara projelere rağmen onu okuyucularımızla buluşturmayı başardık. Her ay çok çeşitli konularda makaleler yazdık ve ciddi bir okuyucu kitlesi oluşturduk. Her ay yeni şeyler öğrenmenin ve öğrendiklerimizi okuyucularımız ile paylaşmanın mutluluğunu yaşadık. Yazı dizileri, yeni teknolojiler, röportajlar,  öğrenci arkadaşlarımıza derslerinde yardımcı olabilecek bilgiler ve daha birçok konu ile olabildiğince geniş bir kitleye ulaşmayı hedefledik. Gelen yorumlardan ve takipçilerimizin fazlalığından da anladığımız üzere bu hedefimizde başarılı olabilmişiz. Yine de yapabileceğimiz çok fazla şey var. Gün geçtikçe daha çok büyüyecek ve gelişecek Readmee.
Readmee’yi bugünlere getiren siz sevgili okuyuculara ve ekibimize çok teşekkür ediyorum. İyi ki doğdun Readmee. Daha da büyüyerek ve gelişerek nice yıllar yaşaman dileğiyle.

QT ile Veritabanı Bağlantıları


Bir önceki yazımızda Qt’yi tanıtmış ve bünyesinde her türlü araç ve kütüphaneyi barındırdığını söylemiştik. Qt’nin özellikle veritabanı konusunda çok büyük kolaylıklar sağladığından ve çok sayıda veritabanını desteklediğinden bahsetmiştik. Bu yazımızda Qt ile veritabanı bağlantıları nasıl yapacağız bunlardan bahsedeceğiz ve basit birkaç örnekle anlattıklarımızı pekiştireceğiz.
Öncelikle QSql kütüphanesinin kullanımından başlayalım. QSql, veritabanınız ile Qt uygulamalarınıza sorunsuz bağlantı yapabilmenizi sağlayan bir modüldür. Qt Sql kütüphanesinde kullanılan çok çeşitli belirleyicileri içermektedir.Sql classı üç farklı katmandan oluşmaktadır.
1.Sürücü Katmanı (Driver Layer): Bu katman, QSqlDriver, QSqlDriverCreator, QSqlDriverCreatorBase, QSqlDriverPlugin ve QSqlResult sınıflarını kapsamaktadır. Sürücü katmanı, belirli veritabanları ile Sql API katmanı arasında köprü görevi görmektedir.
2. SQL API Katmanı (SQL API Layer): Bu sınıflar Sql’ e erişimi sağlayan sınıflardır. Bağlantı işlemi QSqlDatabase sınıfı kullanılarak yapılır. QSqlQuery sınıfı ile veritabanı ile etkileşim yapılır. SQL API katmanı bunların dışında QSqlError, QSqlField, QSqlIndex ve QSqlRecord  gibi sınıfları da desteklemektedir.
3.Kullanıcı Arayüzü Katmanı (User Interface Layer): Bu katman, QSqlQueryModel, QSqlTableModel ve QSqlRelationalTableModel sınıflarını içerir. Bu sınıflar, veritabanındaki dataya erişirler ve Qt’nin model/view framework ü ile birlikte çalışabilecek şekilde dizayn edilmişlerdir.
QSqlDatabase: QSlDatabase veritabanına bağlantı yapmayı sağlayan sınıftır. Bu sınıftan oluşturacağımız nesneler sayesinde veritabanımızı yönetebileceğiz.
QSqlQuery: Bu class sayesinde Sql sorguları oluşturarak veritabanı uygulamaları yapabiliriz.
Şimdi QSqlDatabase sınıfını kullanarak veritabanı bağlantısı oluşturalım.

  QSqlDatabase db = QSqlDatabase::addDatabase("sürücüTipi");  
  db.setHostName("sunucuAdresi");  
  db.setDatabaseName("veritabanıAdı");  
  db.setUserName("kullanıcıAdı");  
  db.setPassword("kullanıcıSifresi");  
  bool ok = db.open();


İlk olarak QSqlDatabase nesnesini(db) oluşturduk. addDatabase() fonksiyonu sürücü tipini belirtmeye yarar. Ne tür bir veri tabanına bağlanılacağını bildirir. Qt birden fazla veritabanını desteklediği için o veritabanına uygun sürücü tipini de belirtmek gerekir. Örneğin kullanılan veritabanına göre şu sürücü tipleri kullanılabilir:

Sürücü Tipi
Açıklama
QDB2
IBM DB2
QIBASE
Borland InterBase Driver
QMYSQL
MySQL Driver
QOCI
Oracle Call Interface Driver
QODBC
ODBC Driver (includes Microsoft SQL Server)
QPSQL
PostgreSQL Driver
QSQLITE
SQLite version 3 or above
QSQLITE2
SQLite version 2
QTDS
Sybase Adaptive Server

setHostName(),setDatabaseName(), setUserName(), setPassword() fonkisyonu ile gerekli bilgileri verdikten sonra  open() fonksiyonu ile veritabanıyla fiziksel bağlantımızı oluşturuyoruz. open() metodunu kullanmadığınız sürece bağlantıyı yapamazsınız. Bu metod, boalean(true/false) sonuç döndürür. Bu sayede bağlantnın açık olup olmadığını kontrol edebiliriz.
Örneklere başlamadan önce değinmek istediğim bir nokta var.  QtCreator ile veritabanı uygulaması geliştirmek için QtCreator’ı açıp, proje tipinizi seçtikten sonra kütüphanelerin bulunduğu bir ekran karşınıza gelecektir. Buradan da QSql seçeneğini aktif hale getirmeniz gerekmektedir. Aksi takdirde QtCreator veritabanı classlarınızı tanımayacağı için hata verecektir.
Şimdi yeni bir proje açalım ve yukarda bahsettiğim gibi QSql seçeneğini seçelim. Projemizin adı da sqlBaglanti olsun ve görsel bir uygulama olsun. Bu durumda projeyi actığımızda sol tarafta sqlBaglanti.h, sqlBaglanti.cpp ve main.cpp  oluşmuş olacak.Biz bağlantı kodlarını içeren bir header file oluşturalım adı connection.h olsun ve projemizin gerekli yerlerinde bu header file’ i kullanalım.
connection.h

#ifndef CONNECTION_H
#define CONNECTION_H

#include
#include
#include
#include

static bool createConnection()
{
QSqlDatabase db = QSqlDatabase::addDatabase("QODBC");

      if(db.isDriverAvailable("QODBC"))
      {
      db.setDatabaseName("DRIVER={SQL Server};SERVER=ServerName;UID=sa;PWD=12345;DATABASE=readmee;");
      } // Bağlantı cümlenizi bu şekilde tek satırla da belirtebilirsiniz.

      if (!db.open()) {
            QMessageBox::critical(0, QObject::tr("Database Error"),              db.lastError().text());
            QString str = db.lastError().text();
      }
     return true;

}
#endif


sqlBaglanti.h kısmında QSqlDatabase nesnemizi tanımlayalım.

#ifndef SQLBAGLANTI_H
#define SQLBAGLANTI_H

#include
#include "ui_sqlbaglanti.h"

#include

class sqlbaglanti : public QMainWindow
{
      Q_OBJECT

public:
      sqlbaglanti (QWidget *parent = 0, Qt::WFlags flags = 0);
      ~ sqlbaglanti ();

private:
      Ui:: sqlbaglanti Class ui;
      QSqlDatabase db;
};

#endif // SQLBAGLANTI_H


main.cpp kısmında oluşturduğumuz createConnection() metodunu çağıralım:

#include
#include " sqlbaglanti.h"
#include "connection.h"

int main(int argc, char *argv[])
{
      QApplication a(argc, argv);
      if (!createConnection())
        return 1;
      sqlbaglanti w;
      w.show();
      return a.exec();
}


sqlbaglanti.cpp

#include
#include

 #include "sqlbaglanti.h"
 #include "connection.h"

sqlbaglanti:: sqlbaglanti (QWidget *parent, Qt::WFlags flags)
      : QMainWindow(parent, flags)
{
      ui.setupUi(this);
}

sqlbaglanti::~ sqlbaglanti ()
{

}


Veri tabanı bağlantımızı yaptık. Şimdi veritabanımıza SqlQuery kullanarak veri ekleme silme gibi işlemleri yapalım.

QSqlQuery query;

    if (!query.exec("SELECT * FROM person"))
      {          
            QMessageBox::critical(0, QObject::tr("Query Error"),db.lastError().text());
            return false;
      }

// veri ekleme
     query.prepare("INSERT INTO person (ID,Name) "
                   "VALUES (:ID, :Name)");
     query.bindValue(":ID", 10);
     query.bindValue(":Name", "Gamze");
     query.exec();

//ID si 3 olan kaydın adını QMessageBox ‘ ta gösterelim:

     query.exec("SELECT * FROM person where ID='3'");
     int fieldNo = query.record().indexOf("Name");
     while (query.next()) {
              Name = query.value(fieldNo).toString();
       }
      QMessageBox::critical(0, QObject::tr("Name"),Name);


QSqlTableModel
Herhangi bir tabloya(tableWidget ya da tableView gibi) veri ekleme işlemlerinde QsqlTableModel sınıfı kullanılır.QSqlTableModel türünde bir nesne/model oluşturulur.Oluşturulan bu modele veriler aktarılır ve yapılacak tüm işlemler bu model üzerinden gerçekleştilir.Bu sayede tekrar tekrar veritabanından veri çekme işlemi yapılmamış olur.
initializeModel() metodu parametre olarak oluşturduğumuz model nesnesini alıyor ve bu nesneye bir takım özellikler atıyor.
createView() metodu ise ekranda gözükecek olan tableViewı olusturuyor ve buna model nesnesine daha önceden aktarılmıs olan veriler aktarılıyor.Bu tableView nesnesini kodla olşturmak yerine QtDesigner’ da sürükle bırak yöntemiyle de projenize ekleyebilirsiniz.
                 
void initializeModel(QSqlTableModel *model)
 {
       
     model->setTable("person");
     model->setEditStrategy(QSqlTableModel::OnManualSubmit);
     model->select();

     model->setHeaderData(0, Qt::Horizontal, QObject::tr("ID"));
     model->setHeaderData(1, Qt::Horizontal, QObject::tr("Name"));
    
 }

QTableView *createView(const QString &title, QSqlTableModel *model)
 {
     QTableView *view = new QTableView;
     view->setModel(model);
     view->setWindowTitle(title);
     return view;
 }



Bu fonksiyonları da main.cpp ‘ de çağırarak ekranda veri tabanından aldığımız bilgilerle doldurulan tableView’ı gösterebilirsiniz.

int main(int argc, char *argv[])
{
     QApplication a(argc, argv);
            if (!createConnection())
        return 1;

     QSqlTableModel model;
     initializeModel(&model);
     
     QTableView *view1 = createView(QObject::tr("Table Model (View 1)"), &model);
     view1->show();

 return a.exec();
}


Bu yazımda sizlere veritabanı uygulamalarınızda ihtiyaç duyabileceğiniz temel işlemlerden bahsettim. http://doc.trolltech.com/4.5/qsqldatabase.html adresinden bu konuyla ilgili daha detaylı bilgi alabilirsiniz. Bu adreste Qt ile ilgili çok geniş doküman yer almaktadır. Buradaki örnekleri inceleyerek öğrendiklerinizi pekiştirebilirsiniz. Qt ‘ nin bu yukarıda bahsettiğim sınıflar dışında daha birçok veritabanı sınıfı bulunmaktadır. Bunları kullanarak çok çeşitli uygulamalar geliştirebilirsiniz.

QT Nedir?


Qt, belli bir platforma bağımlı kalmadan uygulamalar yapmak amacıyla oluşturulmuş bir geliştirme ortamı, aynı zamanda da bir geliştirme kütüphanesidir. 1995 yılında Trolltech adlı Norveç’ li bir firma tarafından geliştirilmiştir. Daha sonra ise Haziran 2008 de Nokia tarafından satın alınmıştır.
 Peki, belli bir platforma bağımlı kalmadan derken neyi kastediyoruz? Qt kullanarak geliştirdiğiniz uygulamaları üzerinde herhangi bir değişiklik yapmadan pek çok masaüstü bilgisayar ve gömülü işletim sistemlerinde kullanabilirsiniz. Qt, MacOS 10.2.8+, X11 ile UNIX (Linux, FreeBSD, Solaris) ve Windows 98/NT/2000/XP ve üzerini desteklemektedir. Qt ile yazmış olduğunuz kodları bu platformlar arasında rahatça taşıyabilirsiniz.
Qt, başlangıçta paralı olarak piyasaya sürülmüştü. KDE masaüstü ortamı Ot ile geliştiriliyordu. Ancak bu ilk başlarda tepkiyle karşılandı çünkü o zamanlar Qt GPL lisanslı değildi. KDE gibi tamamen açık kaynak kodlu bir işletim sisteminin masaüstünün kapalı bir arayüz kütüphanesiyle geliştirilmesi tepki çekti ve bunun sonucunda Qt, GPL lisansı ile lisanslandı. Ancak siz ticari bir yazılım yapmak ve de kodlarınızı açmak istemiyorsanız Qt’nin ticari yazılımlar için olan sürümünü kullanabilirsiniz.
Qt genellikle görsel uygulamalar yazacak C++ geliştiricileri tarafından tercih edilmektedir. Ancak Qt yi sadece bir görsel uygulama kütüphanesiymiş gibi düşünmek de yanlış olur. Qt bünyesinde her türlü araç ve kütüphaneyi barındıran çok geniş bir ortamdır. Qt ‘nin içerisinde veritabanı ve network uygulamaları geliştirmek için gerekli birçok fonksiyon bulunmaktadır. Özellikle veritabanı konusunda Qt çok büyük kolaylıklar sağlamaktadır. Qt,  Oracle,Ms Sql Server, Sybase Adeptive Server, IBM DB2, PostgreSQL, MySQL, Borland Interbase, SQLite, ve ODBC-uyumlu tüm veritabanlarını desteklemektedir.
Qt C++ geliştiricileri tarafından tercih ediliyor dedik. Peki, Qt ‘yi C++ dışında bir dil ile kullanmak mümkün müdür? Elbette. Qt’ nin C++ dışında Java, Phyton, Ruby, C# gibi dillerle de bağlantıları vardır.
Buraya kadar Qt nin birçok özelliğinden bahsetmiş olduk. Şimdi ise sizlere Qt araçları hakkında bilgi vermek istiyorum. Qt’ yi kurduğunuzda arayüz tasarlamak için kullanılan Designer programı da gelmektedir. Bu program ile hiç kod yazmadan tamamen sürükle bırak yöntemiyle çok güzel tasarımlar yapabilirsiniz. Projenizi açtığınızda gelen formun yanı sıra Designer programı ile oluşturdugunuz .ui uzantılı dosyadan istediğiniz kadar oluşturup projenize ekleyebilirsiniz. Ayrıca Qt ‘ yi kurduğunuzda Assistant adlı programı da beraberinde geliyor. Buradan Qt hakkında aradığınız her türlü bilgiye ve de Qt nin hazır fonksiyon ve classlarına ulaşabilirsiniz.Ayrıca Qt uygulamalarını farklı dillere çevirebilmek için Linguist adlı programda beraberinde gelmektedir.
Merhaba Dünya!
Buraya kadar Qt hakkında bilgi sahibi oldunuz. Şimdi gelin bir klasik olan “Merhaba Dünya” ile başlayalım:

1   #include
2   #include

3   int main(int argc, char *argv[])
4   {
5       QApplication app(argc, argv);
6       QLabel *label = new QLabel("Merhaba Dünya!");
7       label->show();
8       return app.exec();
9   }


Ekran görüntüsü şu şekilde olmaktadır:






 Şimdi satır satır açıklayalım:
1.ve 2. Satırda QApplication ve QLabel classlarını uygulamamıza dâhil ettik. Bir Qt uygulaması geliştireceğimiz için QApplication classını dâhil etmek zorundayız. Ayrıca uygulamada yaratacağımız label gibi tüm bileşenler için o bileşene ait classı da eklememiz gerekiyor.
3. satırda ne olduğunu zaten biliyor olmalısınız. Yine de söylemek gerekirse int argc, dışarıdan girilen parametre sayısını char *argv[] ise parametrelerin listesini tutan diziyi göstermektedir.
5. satırda bir Qt uygulaması oluşturuyoruz.
6. satırda bir label nesnesi oluşturuyoruz. Bu label sayesinde yazımız ekranda görünecektir. Qt de tüm bileşenler Q harfi ile başlamaktadır. QLabel, QPushButton, QCheckBox gibi…
7. satırda show() fonksiyonu ile label görünür hale geliyor.
Son satırda ise Qt uygulaması çalıştırılıyor.
Sinyal ve Yuvalar (Signals and Slots)
Sinyal ve slot yapısı Qt programlamanın temelini oluşturmaktadır. Çalışma zamanında herhangi bir olayın oluştuğu anda çalışmasını istediğimiz durumlarda bu yapıyı kullanırız. Şu anda biraz karışık gibi gelebilir ama örneklerle açıkladığımızda bu yapının ne kadar pratik ve de mantıklı olduğunu göreceksiniz. Örneğe geçmeden önce sinyal ve slotların özelliklerinden bahsetmek istiyorum.
Slotlar tipik bir C++ üye fonksiyonu gibidirler. Virtual, overloaded, public, protected ya da private olabilirler. Diğer üye fonksiyonlar gibi her tür parametre alabilirler. Slotların üye fonksiyonlardan tek farkı sinyale bağlı olmaları ve sinyalin tetiklemesi sonucunda fonksiyonu çalıştırmalarıdır.
Bir slota birden fazla sinyal bağlanabileceği gibi bir sinyale de birden fazla slot bağlanabilir.
Birden fazla sinyal de birbirine bağlanabilir. Bu durumda birinci sinyal oluştuğunda ikinci sinyal tetiklenecektir.
Bir slotun erişim hakları hangi sinyallerin o slota bağlanabileceği ile ölçülmektedir.
Sinyalleri slotlara bağlama işlemi QObject sınıfından türemiş olan connect() fonksiyoni ile yapılır.
connect() fonksiyonunun yapısı şu şekildedir:
connect(gönderici, SIGNAL(signal), alıcı, SLOT(slot));
Bu yapıyı incelediğimizde connect() yapısının gayet açık olduğunu görebiliriz. Gönderici parametresi olayın oluştuğu nesneyi söyler. SIGNAL içine yazılan signal ise ilk nesnenin sinyalidir. Sonra olayın etkileyeceği nesne(alıcı) yazılır. Son olarak ise hedef nesnesinin slotu SLOT() içine yazılır.
Şimdi basit bir örnekle sinyal slot yapısının kullanımına bakalım:
 
 1  #include 
 2  #include 
 
 3  int main(int argc, char *argv[])
 4  {
 5      QApplication app(argc, argv);
 6      QPushButton *button = new QPushButton("Quit");
 7      QObject::connect(button, SIGNAL(clicked()),
 8                      &app, SLOT(quit()));
 9      button->show();
10     return app.exec();
11  }


İlk örneğimizde programın genel yapısından bahsetmiştik. Burada                     connect(button, SIGNAL(clicked()), &app, SLOT(quit()));     yapısını inceleyelim. Burada butona basıldığında sinyal tetiklenir ve uygulama sonlandırılır.
SLOT() içerisinde bu örnekte olduğu gibi hazır fonksiyonlar(quit()) kullanabileceğimiz gibi kendi yazdığımız fonksiyonları da kullanabiliriz. Sizce de bu yapı gayet pratik ve mantıklı öyle değil mi?
Bu makalede sizlere Qt’ yi tanıtmaya çalıştım. Aynı zamanda http://trolltech.com/  adresinden de Qt hakkında detaylı bilgi alabilirisiniz ve Qt’ nin en güncel paketlerine erişebilirisiniz.
Yukarıda bahsettiğim özelliklerinden de anlaşıldığı gibi Qt, özellikle de görsel uygulamalar geliştirmek isteyenler için gayet güzel ve etkili bir araç. Platformdan bağımsız olması ve birçok programlama diline destek vermesi açısından da bakıldığında çok geniş kitleye hitap ettiğini söyleyebiliriz.