Daha önce Windows’ta EasyPhp ile Wamp kullandığım ve hostlarda da kurulu geldiği için Apache, Php ve MySql’i hiç ayrı ayrı kurmamıştım. Ayrıca bu işin çok zahmetli olduğunu düşünüp Wamp, EasyPhp gibi ürünleri ortaya koyanlara bolca hayır duası etmiştim zamanında.
Ama bu üçlünün asıl platformunda, Linux’ta Wamp kurmaktan daha akıllıca olan yöntemi seçtim mecburen. Pardus’ta da o kadar zordu ki.. Konsolu açıp koskoca bir satır komut yazıp enter’a basmam bile yetmedi, üzerine bir de parola girmemi istedi benden. Bundan sonra kurulum bitti ama o kadar uğraştırdık :) Yazdığım o koskoca bir satırlık komut da şuydu:
sudo pisi it apache mysql-server mod_php
Ne iş yapıyor peki bu? Apache, MySql ve Php’yi makinemize kuruyor (ya da ben hala öyle zannediyorum). Bu üçlünün kurulması da yetmiyor, Php çalışmak için Apache ve MySql’in başlatılması gerekiyor. Bunu da pekala konsoldan yapmak mümkün ama “Fare ile tıklamak varken ne yapayım ben konsolu?” diyenler olabileceği şüphesiyle onun da yöntemine bakalım.
Uygulama Başlatma Menüsü -> Sistem -> Servis Yöneticisi -> Sunucular yolunu izleyerek aşağıdaki ekrana ulaşıyoruz.
Orada “Apache” ve “MySql server” seçeneklerini bulup başlat düğmesine tıklıyoruz. Her bir sunucu için “başlat”, “yeniden başlat”, “durdur” ve “açılışta çalıştır” seçenekleri var. Artık her kullanıcı işini görecek olan seçeneği bulur zannediyorum.
Php çalışmak için artık her şey hazır görünüyor. Test etmek için tarayıcıyı açıp adres satırına “localhost” ya da “127.0.0.1″ yazıp enter’a bastığımızda karşımıza aşağıdaki (ya da çok benzeyen) bir sayfa gelmeli. Burdaki “localhost” ya da “127.0.0.1″ makinemizin yerel adresidir. Aşağıdaki sayfayı görüyorsak her şey hazır, Php çalışmaya başlayabiliriz demektir.
Bundan sonra yazılanlar standart olmamakla birlikte benim seçtiğim yöntemdir. Editör olarak Netbeans 6.8′i kullanmayı nasıl yaptığımdan kısaca bahsedeceğim. “Yahu Php için de Netbeans mi kullanılır, A editörü daha uygun değil mi, B diye bi araç var bu iş için biçilmiş kaftan, yoksa Netbeans reklamını yapman için sana para mı ödüyor?” diye soran biri olursa cevabımı en baştan vereyim: evet.
Netbeans açıldıktan sonra File -> New Project -> PHP -> PHP Application seçeneklerini seçelim. Bunları yapabilmek için Netbeans Php eklentisinin kurulu olması gerekmektedir.
İkinci adımda proje ismi, kaynak dosyaların nerede tutulacağı, kullanılacak Php versiyonu ve öntanımlı karakter seti seçme ekranı gelecektir. Pardus’ta localhost yolu aşağıdaki gibidir:
/var/www/localhost/htdocs/
Dosyaların bu dizin altında tutulmaları gerekir.
Sonraki iki adımda çalıştırma ayarları ve kullanılacak framework’lerin seçileceği ekranlar var. Bütün bunlardan sonra artık Pardus altında Php çalışmaya başlayabiliriz. Eminim ki daha basit ya da kullanışlı yöntemleri vardır ama bunu da bilmek fayda sağlayabilir.
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
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ı :




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.