Previous
Next

Jabber(Extensible Messaging and Presence Protocol-XMPP) nedir?

by Cem Kefeli 19. Ekim 2009 01:28

JabberExtensible Messaging and Presence Protocol (XMPP) (önceki adıyla Jabber), Internet'teki iki ucun herhangi bir yapısal bilgiyi birbirleri arasında karşılıklı ve neredeyse eş zamanlı aktarmalarına olanak sağlayan açık bir XML protokol ve teknolojileri bütünüdür. Jabber geliştirilebilir bir teknolojidir ve esnektir. Esnek olduğu için dosya gönderebilir, oyun oynayabilir veya aklınıza gelen yeni fikirleri uygulayabilirsiniz.

  • Açıktır: XMPP protokolleri açık ve özgürdür, kolayca anlaşılabilirdir; istemciler, sunucular, bileşenler ve kod kütüphaneleri için birden fazla uygulama mevcuttur.
  • Standarttır: IETF (internet engineering task force) çekirdek XML (Extensible Markup Language) sürekli yayın protokollerini kabul edilen mesajlaşma teknolojisi olacak şekilde formalize etmiştir. XMPP'da kullanılmakta ve IETF'nin standartlaşma sürecine uygun olarak XMPP Standards Foundation (önceki adıyla Jabber Software Foundation) tarafından geliştirilmektedir.
  • Kendini ispatlamıştır. Jabber teknolojisi ilk olarak 1998'de geliştirilmeye başlanmıştır ve şu anda nerede ise tamamen kararlıdır. Şu anda XMPP teknolojileri yüzlerce geliştirici tarafından geliştirilmekte, onbinlerce suncusu Internet üzerinde çalıştırılmakta ve milyonlarca insan mesajlaşma için kullanmaktadır.
  • Merkezi değildir: XMPP ağının mimarisi e-posta mimarisine çok benzer, herhangi bir kişi bir XMPP sunucu işletebilir.
  • Güvenlidir: Herhangi bir XMPP sunucu, XMPP ağından tamamen izole edilebilir, örneğin sadece yerel bir ağ içerisinde kullanılabilir, ve çekirdek XMPP spesifikasyonlarında yer verilen SASL (kimlik doğrulama güvenlik katmanı) ve TLS (iletim katmanı güvenlik protokolü) ile güçlü ve sağlam bir güvenlik sunar.
  • Genişletilebilirdir: Herhangi birisi XML'den faydalanarak çekirdek protokol üzerine kendi istediği fonksiyonları inşa edebilir.Fazlası...

JAVA - Interfaces(Arayüzler)

by Cem Kefeli 18. Ekim 2009 10:52

JavaJava'da kalıtımın nasıl gerçekleştirildiğini "Inheritance(Kalıtım) nedir?" başlıklı yazım içerisinde görmüştük. Kalıtım, OOP(Object Oriented Programming) bir dilde olmazsa olmazlardandır ki, uygulama geliştiricilere çok büyük güzellikler sunar. Tüm canlılarda olduğu bigi nesneler arasında da kalıtım ilişkisi kurulur ve yeni yeni türler tanımlanmasını mümkün kılar. Bir nesne tanımlarsınız, sonra bu nesneden başka bir nesne daha türetebilirsiniz. Fakat ya iki ya da daha çok nesnenin bir araya gelip bir nesne oluşturmasını isterseniz ne olacaktır? İşte burada durum karışıktır! Çünkü java çoklu kalıtmı desteklemez. Bir nesneyi yalnızca bir tane nesneden türetebilirsiniz. Bu aşamada imdadımıza Interfaces(Arayüzler) yetişir ve her ne kadar tam anlamıyla çoklu kalıtım olmasa da buna benzer bir davranışı bizlere sunar.

  • Arayüzler içerisinde yalnızca Abstract(Soyut) metodlar ve sabitler(constants) bulundurabilirler, gövdeli metodlar barındıramazlar. Soyut metodları ve sınıfları incelerken de soyut sınıfların bir birleştirici rol oynadıklarını, soyut sınıflardan türeyen sınıflara adete bir kılavuz gibi yol gösterdiğinden bahsetmiştik. Fakat soyut sınıflar gövdeli metodlar yani iş yapabilen metodlar da barındırabiliyorlardı.
  • Ayrıca bir sınıfın birden fazla soyut sınıftan türemesi de söz konusu değildi.
  • Hem soyut sınıflarda hem de arayüzlerde ortak olan bir nokta ise, soyut sınıflarda abstract olarak tanımlanan ve arayüzlerde tanımlanan her metodun bu soyut sınıf ve arayüzlerden türeyen tüm sınıflarca override edilmesi gerekliliğidir. Bu arada şunu söylemek gerekir ki arayüzler içerisindeki metod tanımlamalarında soyut sınıflarda kullandığımız gibi abstract anahtar sözcüğünü kullanamıyoruz. Nedeni ise arayüzlerin içerisindeki tüm metodların zaten abstract olarak değerlendirilmesidir. Dilin mimarisini oluşturanlar ayrıca bir daha abstract tanımlama yapılmasını gerekli görmemişler. Eğer yazarsanız hata mesajı ile karşılaşırsınız.
  • Bir diğer nokta ise arayüz içerisinde yapılan tüm metod tanımlamaları için bir erişim belirleyicisinin kullanılamayacağıdır. Varsayılan erişim belirteci olarak public seçilmiştir ve sizin bunu değiştirme şansınız da yoktur. Eğer bir metodun erişim belirleyicisini değiştirip örneğin private gibi bir erişim belirteci verebilseydiniz türeyen sınıflarda bu metodları override edebilmek imkansız olacaktır. Bu da arayüzler içerisindeki tüm metod tanımlamaları türeyen sınıflarda override edilmelidir ilkesi ile çelişecektir. Tabi ki metodların dönüş bildirim değerlerinin olmayacağı anlamına gelmemektedir ve bu ikisi birbirinden ayrı şeylerdir.Arayüzler içerisinde metodlar haricinde global alanlar da tanımlayabildiğimizi söylemiştik. Erişim belirleyicisi olarak bu alanlarlar da yine public olarak değerlendirmektedir. Bunu da sizin değiştirme şansınız yoktur. Ayrıca alanlara static ve final erişim belirteci de eklenmiştir, metodlardan farklı olarak. Tabiki bunlar arayüzler içerisinde birebir olrak yazan şeyler değildir. Yazılmasa dahi varsayılan olarak kabul görmektedirler.
  • Soyut sınıflardan başka soyut sınıflar türetebiliyorduk. Bu böyle arda arda devam edip gitmekteydi. Yine hatırlarsanız türeyen soyut sınıflarda, türedikleri soyut sınıf içerisinde yer alan soyut metodları override etme gibi bir zorunluluk da yoktu. Aynısı arayüzler için de geçerlidir. Arayüzler de başka arayüzlerden türeyebilmektedir ve bu özellik de arayüzler arasında da kalıtım ilişkisinin kurulabilmesini sağlamaktadır.

Bu birkaç önemli noktanın üzerinde durduktan sonra şimdi biraz daha uygulamaya dönük birşeyler yapabiliriz artık. Uygulama demişken Java'da arayüzler interface anahtar sözcüğü ile tanımlanmakta ve implements anahtar sözcüğü ile de uygulanmaktadır. Aşağıdaki örnekte yukarıda bahsettiğimiz bu birkaç özellik ile ilgili bir uygulama vermekteyim.Fazlası...

JAVA - Packages(Paketler) kavramı nedir?

by Cem Kefeli 15. Ekim 2009 00:22

JavaDiyelim ki bir başka eve taşınacaksınız. Yani kolileri hazırlama vakti geldi çattı... İlk iş gidip koli bulmak olur heralde, sonra da eşyaları bu kollerin içine düzgün ve anlamlı bir şekilde yerleştirmek. Nasıl yerleştiririz ki acaba? Kırılabilecek mutfak eşyalarını bir koliye, giyecekleri bir koliye, temizlik malzemelerini bir ya da birden çok koliye koyarsak hem daha düzenli olurlar hem de aradığımızı daha kolay bulabiliriz heralde.

Buraya kadar olan kısım, olaya bir girişti aslında. Wink Fakat bu koli paketlerinin mantığının java'da kullanılan paket kavramından hiç bir farklılığı yok. Temel olarak özetlemek gerekirse; Java'da paketler, aynı amaç üzerinde çalışan kod bloklarını bir araya toparlayabilmemiz için kullanılmaktadır. Java'da oluşturulan paketler 'package paket_ismi;' notasyonu ile belirtilmektedir. Bununla ilgili örnek vereceğim ilerleyen satırlarda. Aslında C# kullananların yakından tanıdığı namespace kavramından hiçbir farkı yoktur Java'daki paket kavramının. Oluşan paketlerin kullanılabilmesi için ise import anahtar sözcüğü kullanılmaktadır. Bu da C#'daki using anahtar sözcüğüne karşılık düşmektedir.
Az önce aynı amaç için kullanılan kod parçacıklarının bir araya toparlanmasından bahsetmiştik. Örneğin IO ve math birer paket örneğidirler. IO paketi java'da kullanılan dosya girdi/çıktı işlemleri için yapılabilecek gerekli sınıfları bulundurmaktadır. Yani temel işlevi dosya girdi/çıktı işlemlerin yapılabilmesidir. Math paketi ise matematik işlemlerinin yapılabilmesinden sorumludur ve kullanılabilecek neredeyse tüm matematik işlemlerini bulundurmaktadır. Bu örnekler paketlerinin içeriğinin ne kadar güzel hazırlandığı ve tüm bu aynı amaca hizmet eden kodların nasıl bir araya toplandığına güzel bir örnektir. Paketlerin isimlerinin de güzelce seçilmesi çok önemlidir. Çünkü isimleri içeriklerinin ne olduğunu ve hangi özelleşmiş yapıları barındırdığını güzel bir şekilde anımsatmalıdır.

Aşağda verdiğim örnekte bir paketin uygulamamız tarafından nasıl kullanılabileceğini göstermekteyim.

Main.java  |  Netbeans Projesini indir Packages1.rar (12,43 kb)  |  Gizle  |  Göster
import java.io.*;
import java.math.*;

/**
 *
 * @author Cem KEFELİ
 * http://www.cemkefeli.com
 */
public class Main
{
    public static void main(String[] args)
    {
        // Matematik işlemleri
        double Sayi1 = 5.0;
        double Sayi2 = 3.0;
        double Sayi3;
        Sayi3 = Math.pow(Sayi1, Sayi2);
        System.out.println("Sayi1= "+Sayi1+", Sayi2= "+Sayi2+", Sayi1^Sayi2= "+Sayi3+"");
        //
        // Dosya İşlemleri
        try
        {
            // Dosyayı oluştur
            FileWriter fstream = new FileWriter("out.txt");
            BufferedWriter out = new BufferedWriter(fstream);
            out.write("Merhaba dosya");
            //Output stream'i kapat
            out.close();
        }
        catch (Exception e) //Catch exception if any
        {
            System.err.println("Error: " + e.getMessage());
        }
    }
}

Fazlası...

Blogengine için TinyMCE editörünü özelleştirmek

by Cem Kefeli 13. Ekim 2009 11:03

Blog EngineBlogengine.net kullananlar bileceklerdir ki Blogengine editör olarak TinyMCE'yi kullanmaktadır. Bazı ilginçlikleri ve cinslikleri olmasına rağmen yine de hoş, güzel ve fazlasıyla iş görür bir editör. Yalnız şu tuhaf ki Blogengine alt yapısı ile birlikte gelen editör özellikleri içerisinde birçok güzellik disable edilmiş durumda ve birçok plugin hali hazırda kullanımda değil. Örneğin preview, date-time, font color, highlighter color, template, link ve foto edit etme pencereleri gibi güzellikler olaya dahil edilmemiş. TinyMCE dosyaları /editors dizini altında tiny_mce klasör ismi ile bulunuyor. Bu özellikleri aktif etmeniz için gerekenler ise ilk önce en son sürümü buradaki adresten indirip az önce ismini verdiğim dizin içerisine yerleştirmek. Default olarak bütün plugin'ler indirdiğiniz paket ile birlikte geliyor. Bir diğer adım ise gereken editörü çağıran konfigürasyonu aşağıda verdiğim şekilde yapmanız.

/admin/TinyMCE.ascx  |  Gizle  |  Göster
<script type="text/javascript" src="<%=Utils.RelativeWebRoot %>editors/tiny_mce/tiny_mce.js"></script>
<script language="javascript" type="text/javascript">
tinyMCE.init({
	// General options
	mode : "exact",
	elements : "<%=txtContent.ClientID %>",
	theme : "advanced",
	plugins : "safari, pagebreak, style, layer, table, save, advhr, advimage, advlink, emotions, iespell, 
inlinepopups, insertdatetime, preview, media, searchreplace, print, contextmenu, paste, directionality, 
fullscreen, noneditable, visualchars, nonbreaking, xhtmlxtras, template, wordcount",
	 
	// Theme options
	theme_advanced_buttons1 : "save, newdocument, |, bold, italic, underline, strikethrough, |, 
justifyleft, 
justifycenter, justifyright, justifyfull, styleselect, formatselect, fontselect, fontsizeselect",
	theme_advanced_buttons2 : "cut, copy, paste, pastetext, pasteword, |, search, replace, |, bullist, 
numlist, |, outdent, indent, blockquote, |, undo, redo, |, link, unlink, anchor, image, cleanup, help, 
code, |, 
insertdate, inserttime, preview, |, forecolor, backcolor",
	theme_advanced_buttons3 : "tablecontrols, |, hr, removeformat, visualaid, |, sub, sup, |, charmap, 
emotions, iespell, media, advhr, |, print, |, ltr, rtl, |, fullscreen",
	theme_advanced_buttons4 : "insertlayer, moveforward, movebackward, absolute, |, styleprops, |, cite, 
abbr, acronym, del, ins, attribs, |, visualchars, nonbreaking, template, pagebreak",
	theme_advanced_toolbar_location : "top",
	theme_advanced_toolbar_align : "left",
	theme_advanced_statusbar_location : "bottom",
	theme_advanced_resizing : true,
	 
	// Example content CSS (should be your site CSS)
	content_css : "<%=Utils.RelativeWebRoot %>Style.css",
	 
	// Drop lists for link/image/media/template dialogs
	template_external_list_url : "<%=Utils.RelativeWebRoot %>editors/tiny_mce/lists/template_list.js",
	external_link_list_url : "<%=Utils.RelativeWebRoot %>editors/tiny_mce/lists/link_list.js",
	external_image_list_url : "<%=Utils.RelativeWebRoot %>editors/tiny_mce/lists/image_list.js",
	media_external_list_url : "<%=Utils.RelativeWebRoot %>editors/tiny_mce/lists/media_list.js",
	relative_urls : false,
	 
	// Replace values for the template plugin
	template_replace_values : {
		name : "cem kefeli",
		website : "www.cemkefeli.com"
	}
});
</script>

Fazlası...

Kategoriler: Makaleler

Hakkımda...

Cem KEFELİ

Electronics and
Telecommunication Eng.
devamı...


Son yapılan yorumlar...

Comment RSS

Yasal bir uyarı...

Disclaimer"Bu web sitesinde görmüş olduğunuz bilgilerin, dokümanların ve diğer materyallerin kullanılmasından doğabilecek hiç bir sorumluluktan site sahibi sorumlu tutulamaz. Web sitesi içerisinde yer alan yazılar, yorumlar, resimler ve diğer tüm içerikler yalnızca sahibinin görüşünü yansıtmakta olup içeriğin sahibi kişilerin çalıştığı kurumları bağlayıcı hiç bir nitelik taşımamaktadır. Yapılan tüm alıntılar mutlaka kaynak gösterilerek verilmeye çalışılmaktadır. Web sitesi içerisinde bulunan ilgili materyaller, ilgili yasal kurumlar tarafından uygun görülmemesi durumda kaldırılacaktır."
General