RSS Feed
May 21

Web Servisleri: Netbeans Kullanarak Twitter İstemcisi Yapma

Cuma, Mayıs 21, 2010 tarihinde yazıldı. Kategoriler : Java, Çalışmalar

Netbeans’in sitesindeki web service tutorials sayfasında [0], Software as a Service (SaaS) kategorisinde bulunan Creating a Graphical Client for Twitter [1] isimli dökümanda anlatılanları yapmaya çalıştım ve görüntüsü ile işlevi ordakine benzer bir şey ortaya çıktı.
Bu yazımda, bu iş için uğraşırken neler yaptığımdan bahsedeceğim (anladığım kadarıyla).
Olası yanlış eylem ve anlatımlar için baştan uyarımı yapayım.

Başlamadan önce eğer bir twitter hesabınız yoksa twitter.com’a gidip bir hesap edinin.
Sayfada dediğine göre twitter hesabının yanında Netbeans 6.5, 6.7 ya da 6.8 sürümlerinden biri ile Java Development Kit (JDK) V6 ya da V5′e de ihtiyacımız olacak. Ayrıca “web servisi ne demek?” diyenler olursa bu yazıdan önce wiki’den [2] web servisine baksa hoş olur.

Arayüzün tasarlanması

Tasarlanacak ekranda genel twitlerin akışının olacağı bir liste, kişinin kullanıcı resmi ve durumunu okuyup istediğinde güncellemesi için bir metin kutusuyla bir buton olacak. Şimdi projeyi oluşturalım.

Bunun için; Netbeans’i açıp, File -> New Project -> Java -> Java Application yolunu izleyelim.

Daha sonra projemize bir isim verelim ve Create Main Class seçeneğinin başındaki tick’i kaldıralım. Ben ismi TwitterClient olarak vermişim.
Buraya kadar herhangi bir problem olmadıysa şu aşağıdakine benzer bir görüntü ortaya çıkmış olmalı.

IDE yeni bir proje oluşturacaktır. Şimdi projeye bir paket ekleyelim ve o pakete de bir JFrame Form ekleyelim.
Bunun için paket üzerine sağ tıkladıktan sonra New -> JFrame Form ya da New -> Other -> Swing GUI Forms -> JFrame Form yolu izlenir.
Bu da yapıldıysa karşımızda aşağıdakine benzer bir ekran olmalı.

Finish butonundan sonra IDE yaratılan formu tasarım kipinde açacaktır. Sağ taraftaki palet kısmında da sürükle bırak ile kullanılabilecek tüm Swing bileşenleri bulunmaktadır. Şimdi o paletten bir buton (jButton1) süreükleyip formun üzerine bırakalım. Daha sonra botun özelliklerinden ismi ve iconu değiştirilebilir. Bu buton, metin kutusuna yazdıklarımızı kullanarak durumumuzu güncellemek için kullanacağımız buton.
Butondan sonra bir tane de metin kutusuna ihtiyacımız var. Bunun için de paletten bir tane Text Field (jTextField1) sürükleyip butonun yanına bırakalım.
Buton ve metin kutusundan sonra da kullanıcı resmi için bir tane Label (jLabel1) sürükleyip metin kutusunun yanına bırakıyoruz. Üzerinde sağ tıkladıktan sonra Maximum Size, Minimum Size ve Preferred Size özelliklerini [48, 48] olacak şekilde değiştiriyoruz. Çünkü görünen resim boyutları bu kadar olacak, daha büyük olması sadece gereksiz boşluklara yol açacaktır.

Şimdi de twitlerin listesi için bir adet Scroll Pane ve içine de bir adet List sürükleyip bırakıyoruz. Daha sonra da formu kaydediyoruz.
Tasarımda kullanılacak elemanlar bu kadar. Eğer herhangi bir problem olmadıysa görüntü şuna benzer olacaktır:

Kullanıcı Durumunu Gösterme

Arayüz tasarımından sonra kod kısımlarına başlayabiliriz. Kullanıcı durumunun gösterilmesi için yapılması gerekenleri bu başlık altında yazalım.
TwitterJFrame.java dosyasını açıp, tasarım kısmından kod kısmına geçelim ve main () metodunun yerini bulup üzerinde birkaç satır boşluk bırakalım.
Burda da aşağıdaki gibi yeni bir metod tanımlayalım ;

        private void initUserInfo() {

        }
    

Şimdi IDE’nin Services penceresini açalım. Web Services altında Twitter > What Are You Doing Service > [statuses] > [user_timeline.{format}] > getUserTimeline yolunu izleyelim. Orda bulunan getUserTimeline parçasını yukarda oluşturduğumuz initUserInfo() metodunun içine sürükleyip bırakalım. Karşımızda Customize GET SaaS Service penceresi açılacaktır. O pencerede bulunan count alanının default değerini 1 yapıp diğer default değerleri değiştirmeden devam edelim.

IDE bizim için initUserInfo() metodunun içinde kod üretecektir. Ayrıca org.netbeans.saas ve org.netbeans.saas.twitter paketleri ile içlerinde bazı dosyalar oluşturacaktır. Eğer kod düzensiz görünüyorsa editör içinde sağ tık -> format ya da Alt + Shift + F ile otomatik düzenleme yapılabilir.
Durumdan rahatsız olmayanlar için buna da gerek yok tabi ki :) Oluşturulan bu koddaki if () bloğunun içine aşağıdaki kodu eklemeliyiz :

       StatusType st = resultObj.getStatus().get(0);
       jTextField1.setText(st.getText().trim());
       UserType user = st.getUser();
       String iconSrc = user.getProfileImageUrl();
       URL iconUrl = new URL(iconSrc);
       ImageIcon icon = new ImageIcon(iconUrl, user.getScreenName());
       jLabel1.setIcon(icon);
    

Eklediğimiz bu kod kullanıcı resmimiz ile mevcut durumumuzu jLabel1 ve jTextField1 içinde görüntülememizi sağlamak içindi. Tabi çalışması için IDE’nin yönlendirdiği gerekli importlar yapılmalı. Bunun için Ctrl + Shift + i kısayolu da kullanılabilir. Gerekli importlar da yapıldıktan sonra constructor bulunup içine initUserInfo(); satırı da eklenmelidir.

        public class TwitterJFrame extends javax.swing.JFrame {

            /** Creates new form TwitterJFrame */
             public TwitterJFrame() {
                     initComponents();
                      initUserInfo();
             }
    

Projeyi kaydedip çalıştırdığımızda aşağıdakine benzer bir şeyler ortaya çıkmalı. Bu arada 16 Mayıs 2010′da hayata gözlerini yuman müzisyen Ronnie James DIO’nun da ismi bu yazıda yer almış oldu..

Bu sıra ile gidilirse proje istediğimiz gibi çalışmayacaktır çünkü herhangi bir yere kullanıcı adı ve parola girmedik. Bu bilgileri yazacağımız yer ise org.netbeans.saas.twitter içindeki twitterwhatareyoudoingserviceauthenticator.properties dosyası.

Netbeans sayfasına Windows XP ve Linux için login işlemlerinde problemler çıkacağı yazıyordu.
Ben Pardus 2009.1 kullanıyorum ve bende de bahsettiği problemler çıktı. Çözümü de aynı sayfada verilmiş. Çözümü için örnek projede [3] bulunan twitterclient.AuthDialog.java dosyasını kendi twitterclient paketimize kopyalamamızı ve org.netbeans.saas.twitter altındaki TwitterWhatAreYouDoingServiceAuthenticator.java dosyasını kendimizinkinin yerine koymamızı öneriyordu. Önerdikleri değişiklikleri yaptım ve proje sorunsuz çalıştı.

Durum Güncelleme Metodunun Eklenmesi

Güncelleme butonumuzun metin kutusundan aldığı metni kullanarak durumumuzu güncellemesini sağlamak için butona çift tıklayalım. IDE bizim için jButton1ActionPerformed () metodunu oluşturacaktır. Şimdi yeniden Services penceresinden Web Services -> Twitter -> WhatAreYouDoingService -> Statuses -> [update.{format}] -> updateStatus yolunu izleyelim. Daha sonra da burada bulunan updateStatus metodunu sürükleyip jButton1ActionPerformed() metodunun gövdesine bırakalım. Çıkan penceredeki öntanımlı değerleri kabul edip devam edelim.

Oluşturulan kod içindeki try bloğundaki

        String status = "";
    

satırını

        String status = jTextField1.getText().trim();
    

satırı ile değiştirdikten sonra projeyi kaydedip çalıştıralım. Formumuz artık durum güncellemesi yapabilmektedir.

Kullanıcı İsimlerini ve Durumlarını Formda Gösterme

Twitlerin otomatik görünmesi için bir Timer nesnesine ihtiyacımız olacak. Bunun için consructordaki initComponents(); satırının üzerine Timer nesnesi için bir satır daha eklenir.

    public class TwitterJFrame extends javax.swing.JFrame {

    /** Creates new form TwitterJFrame */
    public TwitterJFrame() {
    Timer t = new Timer("Twitter Updater`", false);
    initComponents();
    initUserInfo();
    }
    

Gerekli importlar yapıldıktan sonra consructor şöyle olacaktır :

    public class TwitterJFrame extends javax.swing.JFrame {

    /** Creates new form TwitterJFrame */
    public TwitterJFrame() {
        Timer t = new Timer("Twitter Updater`", false);
        t.scheduleAtFixedRate(new TimerTask() {

        }, 1500, 75000);
        initComponents();
        initUserInfo();
                    }
     

Sonra da consructordan önce

        private DefaultListModel statuses = new DefaultListModel();
    

satırlarnı koda eklemeliyiz. Gerekli importlar ve eklenen otomatik kodlardan sonra elimizde şu kodlar yer almalı :

        public class TwitterJFrame extends javax.swing.JFrame {

    private DefaultListModel statuses = new DefaultListModel();

    /** Creates new form TwitterJFrame */
    public TwitterJFrame() {
        Timer t = new Timer("Twitter Updater`", false);
        t.scheduleAtFixedRate(new TimerTask() {
            @Override
            public void run(){

            }
        }, 1500, 75000);
        initComponents();
        initUserInfo();
                    }
    

Şimdi yeniden Services penceresine açalım ve Web Services -> Twitter -> What Are You Doing Service -> [statuses] -> [public_timeline.{format}] -> getPublicTimeline yolunu izleyelim. getPublicTimeline metodunu t.scheduleAtFixedRate içindeki run() metodunun gövdesine sürükleyip bırakalım. Açılan pencerede yine default değerleri kabul edip devam edelim. IDE’nin bizim için oluşturduğu kod içindeki if() bloğunun içine(en alta), şu aşağıdaki kodu ekleyelim:

        for (final StatusType st : result2Obj.getStatus()) {
          SwingUtilities.invokeLater(new Runnable() {

              public void run() {
                   statuses.addElement(st);
              }
          });
     }
    

Gerekli kütüphaneler import edildikten sonra genel akıştaki twitlerin alınması işi tamamlanmış oluyor. Şimdi bu twitleri listeleyebilmek için bir
nesne oluşturalım.

Bunun için en başta oluşturduğumuz twitterclient paketinde sağ tıkladıktan sonra New > JPanel Form yoluyla bir JPanel Form ekleyelim. Açılan sayfada JPanel’e Item ismini verelim ve kaydedelim.

Açılan tasarım ekranında paletten bir Label ve Text Pane sürükleyip formun üzerine bırakalım. Label kullanıcı ismini, Text Pane de o kullanıcının twitini gösterecek. Daha sonra tasarım kısmından çıkıp kod kısmına geçildiğinde:

        public class Item extends javax.swing.JPanel {
    

satırına implements ListCellRenderer ifadesi eklenir.

        public class Item extends javax.swing.JPanel implements ListCellRenderer {
    

Bu işlemden sonra aşağıdaki bloğa da yeni satırlar ekleyerek o hale getirelim ve gerekli kütüphaneleri import edelim:

        public Component getListCellRendererComponent(JList list, Object value, int index, boolean sel, boolean focus) {
        StatusType st = (StatusType) value;
        jTextPane1.setText(st.getText());
        jLabel1.setText("<html>" + st.getUser().getScreenName() + "</html>");
        return this;
                    }
    

Artık Item classımız da hazır. Şimdi jFrame’e geri dönelim ve tasarım kipinde açalım. JList üzerinde sağ tıklayıp Properties penceresini açalım.

model özelliğini seçelim ve Ctrl + Space tuşlarına birlikte bastığımızda yeni bir pencere açılacak.

“Set jLlist1′s model property using:” menüsünden Custom Code seçeneğini seçelim ve açılan metin kutusuna “statuses” yazalım ve devam edelim.

Properties penceresindeki cellRenderer özelliğini seçelim ve yine Ctrl + Space tuşlarına birlikte basalım. Açılan pencerede karşımıza çıkan “Set jList1′s cellRenderer property using:” menüsünden Custom Code seçeneğini seçtikten sonra metin kutusune new Item() yazıp devam edelim.

İşte bu kadar!

Projeyi kaydedip çalıştırdığımızda Web Services -> Twitter -> What Are You Doing Service -> [statuses] -> [public_timeline.{format}] -> getPublicTimeline kullandığımız için takip etmediğimiz kişilerin de twitlerini görüntülüyor olacağız. Daha edepli şeyler görmeyi umardım :)

Peki sadece takip ettiğimiz kişilerin twitlerini görüntülemek için ne yapmalıyız? Çok fazla bir değişiklik yok aslında. Yukarıda
Web Services -> Twitter -> What Are You Doing Service -> [statuses] -> [public_timeline.{format}] -> getPublicTimeline yolunu izlemiştik.
Şimdi sadece o yolu Web Services -> Twitter -> What Are You Doing Service -> [statuses] -> [friends_timeline.{format}] -> getFriendsTimeline yoluyla değiştireceğiz. O değişiklikten sonra da aşağıdaki gibi bir ekran elde ettim.

Takip ettiklerim inşallah telif hakkı diye koşmazlar gelecekte arkamdan :)

Bir hazır çalışmanın daha sonuna geldik. İleride belki bir şeyler öğrenirim de kendi çalışmalarımı burda yazarım. Şimdilik umuduyla yaşayıp sıfır uğraşla devam edelim..


[0] -> http://netbeans.org/kb/trails/web.html
[1] -> http://netbeans.org/kb/docs/websvc/twitter-swing.html
[2] -> http://en.wikipedia.org/wiki/Web_service
[3] -> http://www.oguzozkeroglu.com/download/TwitterSwingClient.zip
     -> http://netbeans.org/files/documents/4/2432/TwitterSwingClient.zip

Mar 19

C# Yapar Da Java Yapamaz Mı?

Cuma, Mart 19, 2010 tarihinde yazıldı. Kategoriler : Java

Daha önceki Değişken Adında Türkçe Karakter Kullanımı [C#] yazımda bahsettiğim C#’taki değişken, class, namespace isimlerinde Türkçe karakter kullanabiliyor olmak “C#’ta varsa Java’da neden olmasın?” sorusunu kendime sormama ve neticesinde bu yazının yazılmasına vesile oldu.

Netbeans 6.8 ve Eclipse Galileo ile aynı şeyleri denedim ikisinde de sonuç aynı : C#’ın yaptığını Java da yapıyor; proje, package, class ve değişken isimlerinde Türkçe karakter kullanmak istendiğinde “Abi sen burda Türkçe karakter kullanmaya çalışıyorsun ama bunu yapamazsın, mümkünse onları İngilizce karşılıkları ile değiştir” falan demiyor.

O yazıdaki kodun yaklaşık Java karşılığı aşağıda :

package türkçekarakter;

public class TürkçeKarakterİçerenSınıf {
    public static void main(String[] args) {

        String strTürkçeKarakterİçerenDeğişken = "Değişkenin değeri.";
        System.out.println(strTürkçeKarakterİçerenDeğişken);
    }
}

Şu görseller de Netbeans ve Eclipse’teki proje ve konsol alanları :
Netbeans proje
Netbeans console
Eclipse proje
Eclipse console

Bize programlama derslerinde öğretilen “değişken isminde Türkçe karakter olmaz” artık kural olmaktan çıkıp gelenek haline geliyor sanırım.

Eki 31

Kuyruk Veri Yapısı – [Java]

Cumartesi, Ekim 31, 2009 tarihinde yazıldı. Kategoriler : Java

Veri yapıları dersinin önemli elemanlarından biri olan kuyruk (queue) yapısını Java ile oluşturmaya çalıştım. Kodlar biraz amatörce oldu ama çalışıyor :)

Peki nedir bu kuyruk? Wiki şöyle diyor

FIFO (First In Fist Out – İlk Giren İlk Çıkar) mantığına dayalı kuyruk yapısı ile ilgili yazdığım class:

public class kuyruk {
	// private değişkenler
	private int maxBoyut;
	private long[] kuyrukDizi;
	private int front;
	private int rear;
	private int elemanSayisi;

	// constructor
	// kuyruk degisken_ismi = new kuyruk (eleman_sayisi);
	public kuyruk (int boyut){
		maxBoyut = boyut;
		kuyrukDizi = new long [maxBoyut];
		front = 0;
	    rear = -1;
	    elemanSayisi = 0;
	}

	// metodlar

	// kuyruk boş mu?
	public boolean bosMu() {
		if (elemanSayisi == 0) return true;
		else return false;
	}

	// kuyruk dolu mu?
	public boolean doluMu() {
		if (elemanSayisi == maxBoyut) return true;
		else return false;
	}

	// kuyruğa eleman ekleme
	public void insert (long eklenecekEleman){
		if (rear == maxBoyut -1) rear = -1;
		rear++;
		kuyrukDizi [rear] = eklenecekEleman;
		elemanSayisi++;
	}

	// kuyruktan eleman çekme
	public long remove(){
		long cikarilacak = kuyrukDizi [front++];
		if (front == maxBoyut) front = 0;
		elemanSayisi--;
		return cikarilacak;
	}

	// kuyruğun sonundaki eleman
	public long kuyrukNerde() {
		return kuyrukDizi[front];
	}

	// kuyruğun boyutu
	public int kuyrukBoyutu() {
		return elemanSayisi;
	}
}

yukarıdaki gibidir.

Eyl 11

Sıralama Algoritmaları [2] : Bubble Sort

Cuma, Eylül 11, 2009 tarihinde yazıldı. Kategoriler : Algoritmalar, Java

Daha önceki yazılarımdan birinde(Selection Sort) sıralama algoritmalarına küçük bir giriş yapmıştım. Bu yazı da onun devamı niteliğinde olacak ama açıklama için yine işi daha iyi birilerine (Wiki) bırakacağım. Bubble sort için C/C++ ve Java’da yazdığım kodları yazmam yeterli olur sanırım.

Bu arada Java’da yazdığım kod sayısı 100 satırı geçti bunlarla birlikte :P “Hello World” un üstüne bayağı şey yapmışım demek ki :)

C/C++ Kodu :

void bubbleSort(int dizi[], int elemanSayisi)
{
     int temp;
     int i, j;

     for (i=1; i<elemanSayisi; i++)
     {
         for (j=0; j<elemanSayisi-i; j++)
         {
             if(dizi[j] > dizi[j+1])
             {
                        temp = dizi [j];
                        dizi [j] = dizi [j+1];
                        dizi [j+1] = temp;
             }
         }
     }
}

Java Kodu :

    public static void BubbleSort(int [] dizi)
    {
        int temp;   // Yer değiştirmede kullanılacak geçici değişken
        for (int i=1; i<dizi.length; i++)
        {
            for(int j=0; j<dizi.length-i; j++)
            {
                if (dizi[j] > dizi [j+1])
                {
                    temp = dizi [j];
                    dizi [j] = dizi [j+1];
                    dizi [j+1] = temp;
                }//Önce gelen elaman bir sonrakinden büyükse ikisi yer değiştiriyor
            }// Dizinin ardışık elamanlarını karşılaştırmak için kullandığımız döngü
        }// Her karşılaştırmadan sonra yeniden kaldığımız yerden devam etmemizi sağlayan döngü
    }
Ağu 23

Stack Veri Yapısı – [Java]

Pazar, Ağustos 23, 2009 tarihinde yazıldı. Kategoriler : Algoritmalar, Java

Uzun zamandır bloğuma bir şey yazmıyordum, hazır Java çalışmaya başlamışken öğrendiklerimi ufak ufak buraya ekleyeyim, bilen için çok basit şeyler olsalar da eminim bilmeyen, google’dan buraya gelip bir şeyler öğrenen insanlar da olacaktır. Lafı fazla uzatmaya gerek yok, İlk Giren Son Çıkar (First In Last Out – FILO) mantığı ile çalışan stack (yığın) veri yapısının java kodunu en basit şekilde yazmaya çalıştım. Daha tam öğrenmediğim için erişim belirteçlerini kullanmadım, default değerler neyse öyle işleyecek artık :)

Stack veri yapısı hakkında bilgi almak için Wiki‘yi ziyaret edebilirsiniz.

Gelelim kodumuza :

class Stack
{
    int stck[] = new int[20];
    int p;

    public Stack()
    {
        p= -1;
    }

    void push (int item)
    {
        if (p==9)
            System.out.println("Stack dolu.");
        else
            stck[++p] = item;
    }

    int pop()
    {
        if(p < 0)
        {
            System.out.println("Stack boş");
            return 0;
        }
        else return stck[p--];
    }
}
Mar 4

Sıralama Algoritmaları [1] : Selection Sort

Çarşamba, Mart 4, 2009 tarihinde yazıldı. Kategoriler : Algoritmalar, Java

Bilgisayar ortamında verilerin sıralı olması birçok işi kolaylaştırır. Arama, ekleme, bölme vs. durumlarında verilerin sıralı olması ile olmaması arasında çok büyük performans farkı olabilir.
Birçok algoritma (örneğin binary search) sıralı veriler üzerinde çalışır. Kullanıcı için de verilerin sıralı olması büyük kolaylık sağlar.
Verilerin sıralanması için birçok algortima geliştirilmiştir.

* Selection Sort
* Bubble sort
* Insertion sort
* Shell sort
* Merge sort
* Heapsort
* Quicksort
* Bucket sort
* Radix sort
* Distribution sort
* Shuffle sort

Listeyi uzatmak mümkün. Sıralanacak veririn boyutu, yazılacak kod maliyeti, sistem kaynakları, kullanıcı tercihi vb. durumlara göre herhangi biri tercih edilebilir.
Bunlardan Selection Sort’u inceleyelim. Sayı dizisini kullaracak olursak, algoritma ilk adımda tüm diziyi dolaşacak, en küçük elemanı bulup ilk sıraya yazacak.
Sonra dizinin kalan kısmında aynı işi yeniden yapacak. Kalan kısmı tarayıp en küçük elamanı bulup, ikinci sıraya yazacak. Bu şekilde son elemana kadar gidip en küçükten büyüğe doğru dizimiz sıralanmış olacak.

Viki’de aşağıdaki animasyonu buldum, Selection Sort için hazırlanmış basit bi şey.

Selection Sort

Fonksiyon için de C ve Java’da aşağıdaki kodları yazdım. Aynı işi yapan benzer şeyler de yazılabilir.

C/C++ kodu :

void selectionSort (int dizi[], int elemanSayisi)
{
     int i, j, enKucuk, temp;
     for (i=0; i<elemanSayisi-1; i++)
     {
         enKucuk = i;
         for (j=i+1; j<elemanSayisi; j++)
         {
             if (dizi[j] < dizi [enKucuk])
             enKucuk = j;
         }
         temp = dizi[i];
         dizi[i] = dizi[enKucuk];
         dizi[enKucuk] = temp;
     }
}

Java kodu :

    private static void selectionSort(int [] dizi,int n)
    {
        int temp;
        int enKucuk;
        for(int i=0; i<n-1; i++)
        {
            enKucuk=i;
            for(int j=i; j<n; j++)
            {
                if (dizi[j] < dizi[enKucuk]) enKucuk=j;
            }
            temp=dizi[i];
            dizi[i]=dizi[enKucuk];
            dizi[enKucuk]=temp;
        }
    }

Fonksiyon argüman olarak aldığı diziyi Selection Sort algoritması ile sıralıyor.

İç içe iki tane döngü kullanıldığı için algoritmanın karmaşıklığı O(n²) olur. Küçük boyutlu dizilerde fazla kod yazmaya gerek kalmadan kullanılabilecek bir algoritmadır.