Merhabalar, İki hafta önce yazdığım son yazımda size yeni işimi ve ünvanımı söyleyeceğimi belirtmiştim. Yaklaşık 20 şirketin iş teklifleri sonucunda Filika Bilişim Hizmetlerinde Yazılım Mühendisi olarak Pazartesi günü işime başlıyorum. Daha önceden görev aldığım ve bana iş teklifinde bulunan bütün şirketlere teşekkürlerimi sunar, yeni arkadaşlar ile uyum içerisinde çalışabilmelerini dilerim. Yeniçalışacağım şirket ile ilgili bilgilere www.filika.com adresinden ulaşabilirsiniz.
Cuma, Temmuz 18, 2008
Yeni işim...
XML (Extensible Mark-up Language)
XML’e Giriş
XML (Extensible Markup Language), W3C (Worl Wide Web Consortium) tarafından geliştirilen bir kaynak hazırlama standartıdır.
XML aslında SGML (Standart Generalized Markup Language) adlı daha geniş ve kapsamlı bir standardın alt kümesi sayılabilir. 1980’den beri var olan SGML çok kapsamlı ve karmaşık yapısıyla bazı zorluklar içeriyordu. XML bu karmaşayı mümkün olduğunca azaltmak ve uygulama kolaylığı sağlamak amacıyla geliştirildi.
XML bir dil olmaktan çok bir dil tanımlama aracıdır. Bu standartı kullanarak kendi dilinizi üretebilir, kendi kurallarınızı koyabilirsiniz.
HTML ile XML aynı şey değildir. HTML’in önceden belirlenmiş kuralları vardır ve HTML ile yazılan bir döküman bu kurallara uymak zorundadır. Mesela <BODY> ve <HEAD> gibi imler HTML’de önceden tanımlıdırlar; bunları değiştiremezsiniz. Fakat XML’de imleri siz tanımlarsınız. Bu sayede <BuyukBaslik>, <KucukBaslik>gibi imler tanımlamanız mümkün olabilir.
XML dokümanlarında elemanlar aşağıdaki gibi yazılırlar:
| <Paragraf> |
Yukarıdaki eleman iki im’in arasına yazılmıştır. ˙Imler <ve > sembolleri arasında yazılırlar. Bir im’in etki alanını bitirmek, bir başka deyişle bir im’i kapatmak için / sembolü kullanılır.
Elemanlara bazı özellikler atanabilir.
| <Para kur="dolar">34.25</Para> |
Bu örnekte <Para>adlı imin kuradlı bir özelliği olduğu anlaşılıyor. XML’de boş elemanlar tanımlanabilir. Buna örnek vermek gerekirse;
<Resim kaynak="/home/user/resim.gif"></Resim>
veya
<Resim kaynak="/home/user/resim.gif"/>
XML’in bazı kurallarından bahsedelim:
· Elemanların özellikleri her zaman tırnak işaretleri içerisinde tanımlanmak zorundadır.
<Yazi tip="italik">Maslak</Yazi>
· Boş elemanlar hariç bütün elemanlar açma ve kapama imleri arasına yazılmak zorundadır. Bu kurala göre aşağıdaki satırlar XML kurallarına uygun değildir.
· <Paragraf>Ilk paragraf
· <Paragraf>Ikinci Paragraf
· Doğrusu şöyle olmak zorundaydı
· <Paragraf>Ilk paragraf</Paragraf>
· <Paragraf>Ikinci Paragraf</Paragraf>
· Içiçe geçen imler doğru yapılmalıdır. Bu kurala göre aşağıdaki tanımlama yanlıştır.
· <Kalin><italik>Bu satır yanlış</Kalin></italik>
Doğrusu şöyle olmalıydı
<Kalin><italik>Bu satır do¸gru</italik></Kalin>
Yukarıdaki 3 kural XML kullanıcılarının en yaygın olarak çiğnedikleri kurallardır.
Bunun kaynağı ise HTML kullanma alışkanlığıdır. Tarayıcı (Browser) üreticilerinin yazım hatalarını mümkün olduğunca tolere edebilme kaygısı yüzünden kurallara uygun olmayan HTML dökümanları sanaldoku üzerinde sorunsuz yayımlanabilmektedir. Ancak bu kaygı, beraberinde karmaşık yazılımları gerektirdiği için tarayıcıların dökümanları işleme hızlarında dikkate değer bir düşüş yaşanmaktadır.
Bir XML dökümanı sözkonusu olduğunda 3 önemli dosya gündeme gelir.
· XML kaynak dökümanı
· stylesheet’ denilen, dökümanın herhangi bir yayım aracında nasıl gör üneceğini belirleyen dosya .
· XML kaynağının kurallarının yazıldığı DTD adlı dosya. DTD (Document Type Definition) dosyası XML dosyası içinde kullandığınız imlerin tanımlarının yapıldığı dosyadır .
örnek
<?xml version="1.0" standalone="no"?>
<!DOCTYPE Dunya:Turkiye SYSTEM "sample.dtd">
<!-- XML dokumani burada basliyor -->
<Dunya:Turkiye xmlns:Dunya='http://www.Dunya.com/'>
<Dunya:Insanlar>Duygu Caglar</Dunya:Insanlar>
<Dunya:Yas>21</Dunya:Yas>
</Dunya:Turkiye>
Ilk satırda <?xml ve ?> arasında kalan kısım temel tanımların yapıldığı yerdir. versionXML dökümanının versiyonunu belirtir. standaloneseçeneği XML dökümanının dışarıdan verilecek bir DTD dosyasına ihtiyacının olup olmadığını belirler. standalone=”no” buyruğu dökümanın kendisini tanımlayabilmesi için bir DTD’ye ihtiyac duyduğunu söyler. Bu örnekte ihtiyaç duyulan dosyanın sample.dtdadlı dosya olduğu ayrıca belirtiliyor. Aslında DTD ve stylesheet dosyalarını XML dökümanının içine gömmek mümkündür. Ama genelde tercih edilen bir yöntem değildir .
<!DOCTYPE Dunya:Turkiye SYSTEM "sample.dtd">
satırı dökümanın kök elemanını ve kök elemanı içerisinde yazılacak bütüm imlerin tanımlarının yer aldığı DTD dosyasını belirler. Bizim örneğimizde dökümanın kök elemanı Dunya:Turkiye adlı elemandır. SYSTEM anahtar sözc üğü ise DTD dosyasının ayrı bir yerel dosya içerisinde bulunduğunu belirtir.
<!-- ve -->sembolleri içerisinde yer alan bütün cümleler yorum olarak algılanır ve XML yorumlayıcıları tarafından ihmal edilir. Son olarak Dunya:Turkiye,Dunya:Insanlarve Dunya:Yas imlerini kullandık. C¸ oğu XML imi gibi bunlar da kendilerini tanımlayan DTD'ler olmadan anlamsızlardır. Bu imler görüldüğü gibi iki parçadan oluşmaktadır.
Parçalar arasında : sembolü kullanılmış. Bunun sebebi im adlarını seçerken alanadı kullanmamızdır: sembolünün sol tarafı alanadı'nı, sağ tarafı ise imin kendisini ifade eder
Alanadı kullanımı XML dünyasında yeni kullanılmaya başlamıştır. Kabaca im tanımlarının karışmaması için tasarlanmıştır. Örnek vermek gerekirse; Dunya:Turkiye yerine Turkiye imini kullansaydık ve başka bir yayıncı da Turkiye imini kullansaydı, iki üreticinin ürettikleri dökümanları ortak olarak 6 kullanmaları mümkün olamazdı. Alanadları xmlnsanahtar sözcüğü ile belirtilir.
Eşsizlik sağlası amacıyla alanadları olarak genellikle sanaldoku yörelerinin adları kullanılır. Bizim verdiğimiz örnekte http://www.Dunya.com alanadı olarak kullanılmış. Alanadı olarak sanaldoku sayfalarını kullanmanın bir diğer faydası ise kullanılan XML dökümanı ile ilgili dosyaların herkes tarafından bilinen bir yere konulabilmesine imkan tanımasıdır. Buraya XML’i tanımlayan DTD dosyaları konulabileceği gibi, bazı stylesheet dosyalarıda konulabilir. Son olarak eklenmesi gereken bir nokta ise şudur; ilerleyen zamanlarda tarayıcıların XML programlarını istenilen ölçüde tanımaları durumunda ilgili dökümanlar on-line olarak işlenebilecektir. Tarayıcı bir XML dökümanı ile karşılaştığında onu tanımlayan DTD’yi ilgili yerden çekecek ve varsa stylesheet dosyasını kullanarak görüntüleyecektir.
DTD (Document TypeDefinition)
Bu bölümde DTD kavramını kabaca bir örnek üzerinden anlatmaya çalışaca ğız. Örnek DTD dosyası aşağıda verilmiştir.
<!-- Örnek bir DTD dosyası -->
<!ELEMENT Dunya:Turkiye (Dunya:Insanlar, Dunya:Yas)>
<!ELEMENT Dunya:Insanlar (#PCDATA)>
<!ELEMENT Dunya:Yas (#PCDATA)>
Bu DTD dosyasının amacı bir önceki bölümde yazdığımız XML kaynağını tanımlamaktır. <!ELEMENT buyruğu XML dökümanı içerisinde kullanılan büt ün imleri tanımlamak için kullanılır. Dunya:Insanlar ve Dunya:Yas imleri Dunya:Turkiye iminin içerisinde ve belirlenen sıra ile kullanılmak zorundadır .
Bu iki im’e Dunya:Turkiye iminin çocukları denir.
Dunya:Insanlar ve Dunya:Yas imlerinin tanımlarında ise #PCDATA sözcüğü kullanılmıştır (PCDATA=’Parsed Character Data’). Bunun anlamı Dunya:Insanlar ve Dunya:Yas imleri arasında < ve & hariç bütün karakter veya karakter kümesini kullanabilirsiniz. Mesela <Dunya:Insanlar>Dunya Turkiye</Dunya:Insanlar> satırı doğru bir XML satırıdır .
XSL (Extensible Stylesheet Language)
Yazdığımız DTD ile XML dökümanını tanımlamış olduk. Bu çerçeve içinde elimizdeki dökümana doğru tanımlanmıştır (valid) diyebiliriz. Ancak dök ümanın görüntülenişi hakkında hiçbirşey yapmadık. Bu iş için stylesheet kullanmamız gerekecek. Stylesheet olarak şu an yaygın olarak kullanılan CSS (Cascading Style Sheet) aracını kullanabilirsiniz. CSS daha çok HTML dökümanlarını biçimlendirmek için kullanılmakla birlikte XML’i de desteklemektedir.
Biçimlendirme için kullanılabilecek ikinci bir araç ise XSL (Extensible StyleSheet Language) adı verilen ve kendinize özgü stylesheet kodları oluşturabilmenize olanak sağlayan dildir. XML kullanmamızın sebebi yanlızca sanaldoku olmadığı için biz XSL kullanmayı tercih edeceğiz. Bu bölümde XSL kavramını kabaca bir örnek üzerinden anlatmaya çalışacağız. Örnek XSL dosyası aşağıda verilmiştir.
<?xml version="1.0"?>
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/TR/WD-xsl"
xmlns:fo="http://www.w3.org/TR/WD-xsl/FO">
<xsl:template match="/">
<fo:block font-size="18pt">
<xsl:apply-templates/>
</fo:block>
</xsl:template>
</xsl:stylesheet>
Bu örnekte dikkati çeken ilk şey bir XSL dosyasının aynı zamanda düzgün tanımlı bir XML dökümanı olmasıdır. XML dökümanını biçimlendirecek buyruklar <xsl:stylesheet> ve </xsl:stylesheet> imleri arasında yer alırlar. Genel olarak bakıldığında XML dökümanı içerisinde yer alan imlerin formatları <xsl:template> ve </xsl:template> imleri arasında tanımlanır.
<xsl:template match="/">
Yukarıdaki satır, / ile belirtilen im için bir şekil tanımlar. /sembolü kök elemana karşılık gelir. Bizim örneğimizde kök eleman Dunya:Turkiye idi. Bizim XSL örneğimize göre kök elemanı içerisindeki yazıların font büyüklükleri 18pt olmak zorunda.
Bu XSL dosyasını XSL yorumlayıcılarından birinden geçirirsek XML dosyasının görüntüsünü elde edebiliriz.
Bir XML dökümanının doğru olması için gereken şartlar:
· Bir XML dökümanı ya DTD kullanmalı ya da dökümanın başında <?xml version="1.0" standalone="no"?> deklerasyonu yer almalıdır.
· Elemanların bütün özellikleri çift tırnaklar içinde belirtilmelidir.
· Bütün elemanlar açma ve kapama imleri arasında yazılmalıdırlar.
· Boş bir im kullanılacaksa im’in bitiminden önce \ işareti kullanılmalıdır.
· <Resim kaynak="duygu.jpg"/>
Bazı XML buyrukları
<?xml...?>
<?xml version="number"
[encoding="encoding"]
[standalone="yes[no]"] ?>
version XML dökümanının versiyonu gösterir ve kesinlikle yazılması gerekir. encoding Kullanılacak karakter kümesini belirtir US-ASCII, iso-8859-1 gibi. standalone Eğer ’no’ ise, dökümanı tanımlayan bir DTD belirtmek zorunludur. Bunun için <!DOCTYPE> buyruğu kullanılır.
<!DOCTYPE>
<!DOCTYPE root-element SYSTEM|PUBLIC
["name"] "URI_of_DTD">
Bu buyruk XML dökümanını tanımlayan DTD kaynağını belirtmek için kullanılır. İki şekilde kullanılılabilir.
<!DOCTYPE root-element SYSTEM "URI_of_DTD">
<!DOCTYPE root-element PUBLIC "name" "URI_of_DTD">
SYSTEM DTD dökümanının yerini belirtir.
<!DOCTYPE <Book>
SYSTEM "http://www.domain.com/dtd/mydoctype.dtd">
PUBLIC Eğer kullanılan DTD çok büyük bir yaygınlık kazandı ise özel bir isimlendirme şeması kullanılır. XML işlemcisi bu tanımı gördüğü zaman ilgili DTD kaynağını sistemde kayıtlı olduğu yerlerden bulmaya çalışacaktır. Eğer ilgili dosyayı bulamaz ise SYSTEM buyruğu ile tanımlanmış DTD’yi kullanacaktır.
<!DOCTYPE <Book> PUBLIC
"-//Dunya/DTD/EN"
"http://www.Dunya.com/dtd/xmlbk.dtd">
<![CDATA[...]]>
XML dilinde özel anlamları bulunan karakterleri özel anlamları haricinde kullanmaya yarar. ’...’ ile belirtilen yere yazılan herşey XML işlemcisi tarafından salt metin olarak algılanacaktır
<![CDATA[
Burada XML dilinde özel anlamları bulunan karakterleri
bir problem olmadan rahatça kullanabiliyorum. Meselâ
<?xml version="3.145678"?> yazmam bir hata mesajı
üretmeyecektir.
]]>
<!--....-->
XML dokümanı içerisine bazı açıklamalar veya yorumlar yazabilmemizi sağlar.
XML’e Has Özelikler
xml:lang
xml:lang="iso_639_identifier>
xml:lang özeliği bütün elemanlar için kullanılabilir. Elemanın hangi dilde yazıldığını belirtmek için kullanılır.
<Paragraf xml:lang="en">Hello</Paragraf>
<Paragraf xml:lang="fr">Bonjour</Paragraf>
xml:space
xml:space="default|preserve"
Elemanın içerisinde yer alan boşluk veya tab karakterlerinin dikkate alınıp alınmamsını belirler. Eğer ’preserve’ seçeneği kullanılırsa boş ve tab karakterleri dikkate alınacaktır.
xml:link
xml:link="link_türü
Elemanın bir link olduğunu belirtmek için kullanılır.
Özel Karakterler
XML’de özel manaları bulunan karakterleri ifade edebilmek için değişik bir metod kullanılır. XML’de yaygın olarak kullanılan 5 özel karakter şöyle gösterilir.
· & &
· < <
· > >
· " "
· ' '
Kolaylıkla görüleceği gibi özel karakterleri ifade etmek için & ve ; işaretleri beraber kullanılır.
DTD ˙Içinde Eleman Tanımları
XML dökümanı içerisinde kullandığınız elemanların tanımlarını DTD dosyaları içerisinde yapmak zorunluluğu vardır. Bunun için şu kalıp kullanılır.
<ELEMENT eleman_ismi kural>
Eleman isminin içerisinde < ve > karakterleri olmamalıdır. Eleman isimleri karakter veya _ sembolü ile başlamalıdır. Ayrıca eleman isimleri xml ile başlamamlıdır. Bu son kurala uyulmaması aslında ciddi bir probleme yol açmayabilir. Ancak xml sözcüğü ile başlayan ve XML yapısı içerisinde özel anlamları olan bir takım imler bulunmaktadır. Bu imlerde çakışma olasılığı bulunduğundan ötürü bu kısıtlamaya uyulması çok yerinde olacaktır.
111 ANY ve PCDATA 222 En basit eleman tanımı ANY buyruğu ile yapılır.
<!ELEMENTkutuphaneANY>
’ANY’ sözcüğü ile <kutuphane> ve </kutuphane> imleri arasında herhangi bir karakterin veya karakter katarının veya başka imlerin bulunabilmesi sağlanır. Eğer iki im arasında sadece özel bir takım karakterlerin tanımlanması isteniyorsa ’PCDATA’ anahtar sözcüğü kullanılır.
<!ELEMENTkutuphane(#PCDATA)>
Bu buyruk ile <kutuphane> ve </kutuphane> imleri arasında eleman isimleri hariç diğer karakterlerin yer alabileceği belirtilir. Bir örnek vermek gerekirse
<kutuphane>KTU Kütüphanesi</kutuphane>
<kutuphane></kutuphane>
kullanımları doğru olduğu halde
<kutuphane>
<universite>KTU</universite>
Kütüuphanesi
</kutuphane>
kullanımı yanlıştır.
Bununla beraber bir elemanın içerisinde başka elemanların bulunma zorunlulu ğu şu şekilde belirtilir.
<!ELEMENT Insan (Baslik>>
<!ELEMENT Baslik (#PCDATA>>
Yukarıdaki örnekte Insan imi içerisinde Baslik imi bulunmak zorundadır.
15
<!ELEMENT Insan (Baslik, Tarih)>
<!ELEMENT Baslik (#Baslik)>
<!ELEMENT Tarih (#Tarih)>
Yukarıdaki örnekte ’Insan’ im’i içerisinde ’Baslik’ ve ’Tarih’ imleri olmak zorundadır ve belirtilen sıraya uymak zorundadır.
<!ELEMENT Insan (Baslik|Tarih)>
<!ELEMENT Baslik (#Baslik)>
<!ELEMENT Tarih (#Tarih)>
Yukarıdaki örnekte ’Insan’ im’i içerisinde ’Baslik’ veya ’Tarih’ imlerinden birisi olmak zorundadır. Ancak ikisi birden bulunamaz.
Gruplama ve Yineleme
Imlerin XML dökümanı içerisinde yer alma sırasını belirlemek mümkündür.
<!ELEMENT Insanlar ((baslik, yazar)| aciklama)>
<!ELEMENT baslik (#PCDATA)>
<!ELEMENT yazar (#PCDATA)>
<!ELEMENT aciklama (#PCDATA)>
Yukarıdaki örnekte ’Insanlar’ im’i içerisinde ya ’aciklama’ im’i olmak zorundadır ya da ’baslik’ ve ’yazar’ im’i ardarda olmak zorundadır. Ayrıca bu imlerin kaçar defa yer alabileceğini belirleyebilirsiniz.
? Ya bir kere, ya hiç
+ En az bir kere
* Bir çok kere veya hiç
<!ELEMENT yazar (yazarismi+)>
<!ELEMENT yazarismi (#PCDATA)>
Yukarıdaki örnekte ’yazar’ im’i içerisinde ’yazarismi’ im’i ya bir kere yer alacaktır veya hiç kullanmayacaktır. Buna benzer fakat daha karmaşık tanımlamalar yapmak mümkündür .
Boş İmler
XML dökümanı içerisinde yer alan boş elemalar ayrıca tanımlanmak zorundadır.
<!ELEMENT elemanismi EMPTY>
Entities
<I>General Entities</I>
Bir karakter kümesi için makro tanımlamak için kullanılır.
<!ENTITY isim "karsilik">
<, >, &, 've " karakterleri i»cin gereken tanımlamalarıkendi DTD dökümanınız içerisinde yapmak zorunda değilsiniz. Bunlar XML işlemcisi tarafından önceden yapılmıştır. Copyright sembolu için bir makro tanımı aşağıdaki gibi yapılabilir. Bu sembolün Unicode karşılığı 169 (Hexadecimal 0xA9) ’dur.
<!ENTITY copyright "©">
<I>Parameter Entities</I>
Bir önceki gibi makrolar tanımlamak için kullanılır ancak tanımlanan makrolar sadece DTD içinde kullanılmak içindir. Bu şekilde tanımlanan bütün makro isimlerinin başına % sembolü konulur. Bu sembol makronun sadece DTD içerisinde kullanılabileceğini gösterir.
<!ENTITY % isim "karsilik">
<I>External Entities</I>
Dısarıdan yapılan linkler için kullanılır.
<!ENTITY alinti SYSTEM
"http://www.Dunya.com/stocks/quoates.xml">
Eğer ‘alinti’ adli makro, XML dökümanı içerisinde kullanılacak olursa, işaret edilen URL’den yani http://www.Dunya.com/stocks/quoates.xml adresinden içerik alınacak ve XML dökümanı içerisine gömülecektir.
Örnekler
Örnek 1
<?xml version="1.0" standalone="yes"?>
<!DOCTYPE Insan SYSTEM "file:///bilisim/duygu/doc/xml/prog01.dtd">
<Insan>Beginning XML</Insan>
<!ELEMENT Insan (#PCDATA)>
<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<xsl:value-of select="."/>
</xsl:template>
</xsl:stylesheet>
Örnek 2
<?xml version="1.0" standalone="no"?>
<!DOCTYPE Insan SYSTEM "file:///bilisim/Duygu/doc/xml/prog02.dtd">
<Insan> Insan
<Baslik>Duygu Caglar XML</Baslik>
</Insan>
<!ELEMENT Insan (Baslik)>
<!ELEMENT Baslik (#PCDATA)>
<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<xsl:value-of select="."/>
</xsl:template>
<xsl:template match="Baslik">
<xsl:value-of select="."/>
</xsl:template>
</xsl:stylesheet>
Örnek 3
<?xml version="1.0" standalone="no"?>
<!DOCTYPE Kisi SYSTEM "file:///bilisim/Duygu/doc/xml/prog03.dtd">
<Kisi> Duygu Caglar </Kisi>
<!ELEMENT Kisi (#PCDATA)>
<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<HTML>
<xsl:value-of select="."/>
</HTML>
</xsl:template>
</xsl:stylesheet>
Örnek 4
<?xml version="1.0" standalone="no"?>
<!DOCTYPE Insan SYSTEM "file:///bilisim/Duygu/doc/xml/prog04.dtd">
<Insan>
<Baslik>System Duygu Caglar</Baslik>
</Insan>
<!ELEMENT Insan (Baslik, Konu)>
<!ELEMENT Baslik (#PCDATA)>
<!ELEMENT Konu (#PCDATA)>
<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<HTML>
<xsl:value-of select="."/>
</HTML>
</xsl:template>
</xsl:stylesheet>
Örnek 5
<?xml version="1.0" standalone="no"?>
<!DOCTYPE Insan SYSTEM "file:///bilisim/Duygu/doc/xml/prog05.dtd">
<Insan>
<Baslik>Duygu Caglar</Baslik>
</Insan>
<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
20
<xsl:template match="/">
<HTML>
<xsl:apply-templates/>
</HTML>
</xsl:template>
<xsl:template match="Baslik">
<HEAD>
<xsl:value-of select="."/>
</HEAD>
</xsl:template>
</xsl:stylesheet>
Örnek 6
<?xml version="1.0" standalone="no"?>
<!DOCTYPE Insan SYSTEM "file:///bilisim/Duygu/doc/xml/prog06.dtd">
<Insan>
<Baslik>System Duygu Caglar</Baslik>
<Konu>System Yonetici Nitelikleri</Konu>
</Insan>
<!ELEMENT Insan (Baslik, Konu)>
<!ELEMENT Baslik (#PCDATA)>
<!ELEMENT Konu (#PCDATA)>
<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<HTML>
<xsl:apply-templates/>
</HTML>
</xsl:template>
21
<xsl:template match="Baslik">
<HEAD>
<xsl:value-of select="."/>
</HEAD>
</xsl:template>
<xsl:template match="Konu">
<P>
<xsl:value-of select="."/>
</P>
</xsl:template>
</xsl:stylesheet>
Mutluluk ve Yaşam
Kendimizi evlenince, bir bebek sahibi olunca, sonra bir tane daha olunca yaşamın daha güzel olacağına inandırmışızdır.
Sonra çocuklarımızın yeterince yetişkin olmadığını düşünerek bunalırız ve onlar büyüdüklerinde bunun da iyi olacağını düşünürüz.
Sonra büyürler ve biz yine bunalırız, çünkü onlarla didişmemiz gerekir. Şu delikanlılık çağını atlatsalar daha mutlu olacağız tabii.
Eşimiz o işe girebilse, bir arabamız ya da daha iyi bir arabamız olsa, tatile çıksak, sonunda emekli olsak yaşamın daha iyi olacağını düşünürüz.
Gerçek şu ki, mutlu olmak için şu andan daha iyi bir an olamaz.
Öyle değilse, ne zaman?
Yaşamınız hep güçlüklerle dolu olacak. Olduğu kadar çok kabullenip herşeye karşın mutlu olmaya karar vermek en iyisi.
Uzun bir süre yaşam yeni başlayacak sandım. Gerçek yaşam...
Fakat yolda hep bir engel vardı; bitirilecek bir iş, aşılması gereken bir sıkıntı, tanınacak bir zaman, ödenecek bir fatura. Sonra başlayacaktı yaşam.
Sonunda anladım, bu engeller yaşamın kendisiydi.
Bu bakış açısı, benim mutluluğa bir yol olmadığını anlamama yardımcı oldu.
YOL, mutluluğun kendisi idi.
Yani, her anın tadını çıkarın.
Mutlu olmaya karar vermek için, okulun bitmesini, okula geri dönmeyi, beş kilo kaybetmeyi, beş kilo almayı, işe başlamayı, evlenmeyi, cuma gecesini, pazar sabahını, bir araba almayı, araba yenilemeyi, ev ipoteğinizin bitmesini, ilkbaharı, yazı, sonbaharı, kışı, ayın birini ya da on beşini, radyoda melodinizin çalınmasını, ölmeyi ya da yeniden doğmayı beklemeyin.
Mutluluk bir yolculuktur, bir varış noktası değil.
Mutlu olmak için en iyi zaman… ŞİMDİ!
Anı yaşayın ve doya doya tadını çıkarın.
Şimdi, aşağıdaki soruları düşünüp yanıtlamaya çalışın:
1 – Dünyadaki en zengin 5 kişinin adını söyleyin.
2 – En son seçilen 5 Dünya Güzelinin adlarını söyleyin.
3 – Son 10 Nobel Ödülünü kimler kazandı?
4 – En iyi erkek oyuncu Oscar ödülünü en son hangi 10 oyuncu aldı?
Yapamadınız mı?
Zor, değil mi?
Tasalanmayın, hiç kimse bunları anımsamıyor.
Alkışlar söner!
Ödüller tozlanır!
Kazananlar çabuk unutulur.
Şimdi de şu soruları yanıtlayın:
1 – Eğitiminize katkıda bulunan 3 öğretmeninizin adını söyleyin.
2 – Gerektiğinde yanınızda olmuş 3 dostunuzun adını söyleyin.
3 – Size özel olduğunuzu hissettiren birkaç kişi düşünün.
4 – Birlikte zaman geçirmek istediğiniz 5 kişinin adını söyleyin.
Yapabildiniz mi?
Daha kolay, değil mi?
Yaşamınızda anlamı olan kişiler, “en iyi” olarak dereceye girmiş, en çok parası olan, en büyük ödülleri kazananlar değil… Sizi seven, sizi gözeten, ne olursa olsun yanınızda olanlar.
Bir an düşünün.
Yaşam çok kısa!
Ya siz, hangi listedesiniz? Bilmiyor musunuz?
Cuma, Haziran 27, 2008
KTÜ ve Sonrası...
Merhabalar,
Uzun süredir hem bloguma hem de makale yayınladığım bir çok topluluğa maalesef herhangi bir gönderi yapamıyordum. Bu açıdan beni takip eden herkesten özür diliyorum. Fakat böyle bir şey yapmamım benim açımdan çok önemli bir sebebi vardı. Bu ise benim KTÜ 'deki bölümümden mezun olmak için verdiğim çabalardan ötürüydü ki başardım. :)
Özellikle üniversitede ki son dönemim çok yorucu geçti fakat istediklerimi almış gibi gözüküyorum. Bana bu bilgileri kazanmamı sağlayan akademisyenlerime ve desteklerini esirgemeyen hersekese teşekkürlerimi sunuyorum. Bana destek veren akademisyenlere gelirsek, benimle en çok ilgilenen ve her sorunumu çözmek için çaba harcayan, her türlü deli düşünceme destek veren Bölüm Başkanım Yrd. Doç.Dr. Zafer KÜÇÜK 'e, canım sıkıldığı zaman benden sohbetten kaçmayan ve sonsuz desteklerini sürekli bana hatırlatan Dekan Prof. Dr. Kenan ÇELİK 'e ve Dekan Yardımcısı Prof. Dr. Erhan ÇOŞKUN 'a, son senemde benimle düşündüğü herşeyi paylaşan ve düşündüklerim konusunda bana danışan Yrd. Doç. Dr. Orhan KESEMEN 'e ve diğer adını yazmadığım bütün herkese teşekkürlerimi sunuyorum.
Yukarıda isimlerini saydığın öğretim üyeleri arasında öyle biri var ki belki de bloguma şu anda sizlerin okumasında, topluluklarda lider olmamda ve diğer benimle ilgili bir çok konuda kendisinin çok büyük bir payı olmuştur. 3 yıl önce kendisine gidip ben Türkiye Bilişim Derneğinin Genç temsilcisi olmak istiyorum dediğim zaman benimle çok kısa bir süre sonra gel haftaya Ankara 'ya gidip seni temsilci yapalım demesiyle hayatımda büyük bir değişim ve devamında sizlerin de takip ettiği bir çok gelişme hayatımda gerçekleşmiştir. Bana bu büyük katkıyı sağlayan insan ise KTÜ Rektör Danışmanı Bilal KINAY 'dır. O kadar iyi kalpli ve babacan bir insan ki ne tür derdiniz olursa olsun gidip kendisiyle konuşabiliyorsunuz ve sizlere çözüm yolları sunarak mutlu bir biçimde geri dönmenize olanak tanıyor.
Sektörel anlamda ise her zaman sorunlarım konusunda danıştığım ve desteklerini benden esirgemeyen Microsoft 'tan Eminay Yurtseven 'e, Mehmet Nuri Çankaya 'ya ve özellikle de Mehmet EMRE 'ye, Yurtiçi Kargo dan Zafer Şafak TOKCANLI 'ya ve Demirhan ŞENER 'e, Arıkanlı Holding 'ten stratejik planlama danışmanlığımı da yapan Levent ÖZDEMİR 'e, Filika 'dan java ile ilgili bilgilerini benimle paylaşan Akın ERKAYA 'ya ve sohbet etmekten zevk aldığım Servet KOÇ 'a teşekkürlerimi sunuyorum.
Biraz fazla teşekkür oldu farkındayım ama yukarıda isimlerini saydıklarım bana destek verenlerin sadece bir kaçıdır. Hepsini saymaya kalmışsam onlarca sayfa yetmeyecektir. O yüzden aklıma ilk gelenleri tercih ettim.
Karadeniz Teknik Üniversitesi konusunda biraz değinmek gerekirse, herkesin aklında olan ortak bir soru var, " Neden ÖSS 'den aldığın puan evininde olduğu İstanbul 'daki üniversitelerde istediğin bölümleri kazanmana yeterken faklı bir üniversiteyi saçtin? "
Bu soruyu o kadar çok açıkladım ki bir kerede genel olarak açıklayayım dedim. Şimdi benim düşüncem şu yöndeydi. İlk olarak kendimi en üst düzeyde geliştirmek istiyordum ve bu gelişimi sadece ders konusunda değil adımı Türkiye 'de sektörümde büyük bir topluluğun tanıması için elimden gelen her şeyi yapmak şeklindeydi. Daha önce ki öğrencilik tecrübelerimi de göz önüne aldığımda yalnızca okul derecelerine girip başka bir şey yapmayan bir öğrenci olduğumu anlamış ve İstanbul 'da okumaya devam edersem durumun yine değişmeyeceğini düşündüm. Bu sebepten ötürüde bütün tercihlerimi İstanbul dışı yaptım (Ankara ve İzmir 'i de tercih etmeden çünkü oralarda da aileden yaşayanlar vardı ve durum değişmeyecekti). Sonuç olarak ta ismini bile duymadığım ama geleceğinin sınırsız olduğuna inandığım bir bölüme geldim. İstatistik ve Bilgisayar Bilimleri.
Peki bu bölüm neydi? Mekatronik Müh. gibi miydi yoksa iki bölümü birden mi bize okutturacaklardı ? Sorular böyle uzayıp gidiyordu. Bölümle ilgili net bilgileri aldığım zaman iki bölümü de okuttukları ve yurtdışında bölüm mezunlarının Yazılım Mühendisi ünvanı aldığını, Türkiye de hiç kimsenin bölümü tanımadığı ve sadece devlet üniversitesi olarak KTÜ 'de olduğunu öğrendim. Bu demek ki yaptığımız her şey dikkatlice incelenekti. Ayrıca bölüm yeni bir bölüm değil yaklaşık 15 yıllk bir bölümdü. Üniversite yaşamım başladı ve kendimi geliştirme işlemlerine bölüm kulübünden insan kaynakları başkan yardımcısı olarak başladım. Sonra böyle uzayıp gitti. Ama asıl önemli şey bize üniversite yaşamamız boyunca yalnızca temel bilgilerin verildiği ve bizler ekstra bilgiler öğrenmek istersen daha fazla çaba harcamamız gerektiğini kavramış olamamız gerektiyor. Eğer bu bilinçle üni. yaşamınıza başlarsanız bence hiç bir şeyden korkmayın. Okulunuz bitmeden aylar önce işiniz hazır olacaktır.
Bölüm ile bilgiler böyle uzayıp gider. Ben bunun yerine sizlere üniversitenin ana giriş kapısının resimleri sizlere vereceğim. Benim çok hoşuma gidiyor burası. Ayrıca unutmayın Karadeniz Teknik Üniversitesinin kampüsü herkes tarafında harika olarak bilinmektedir.
Dşğer resimleri zaten klasik fakülteler, dekanlıklar, rektörlük falan filan :) Bi de çok güzel bir nokta var. Eğer uçakların kalkışını ve inişini izlemeyi seviyorsanız. Hava limanı hemen üniversitenin yanında ve üni. yönetimi bizler bu uçakları izleyebilelim diye balkonlar ismi verilen güzel yerleri yapmışlar. Hava limanının altında da hemen deniz var. İsteyen yüzebilsin diye:)
Sizlere bahsedeceğim son konu ise şuan da kime destek verdiğim konusudur. Son bir aya kadar üzerimde ki temcilcilikleri kime vereceğim konusunda herhangi bir fikrim yoktu. Çünkü kriterim bilginin yanıda temiz kalpllik ve insanlara güven veren bir kişiliğe sahip olmaktı. Beni tanıyanlar da bilirler ben kolay kolay bir insana destek veren bir kişi değilimdir. Bu sebepten ötürüdür ki kimseye seni destekliyorum diyemiyordum. Sonunda o kişiyi de bulmuş olmanın huzuru ile okuldan ayrılıp evime dönebildim. Peki nasıl seçtim sorusuna gelirsek, hiç bilmediği bir konuyu sadece bir günden öğrenebilen, insanların bakarken güven hissettiği ve iyi kalpliliğine hayran kaldığı ayrıca kişiliği de benim kinin kopyası olan birisiydi kendisi. Bu kriterler konusunda benim yapacağım tek şey kendisini desteklemek olacaktı. Desteklediğim kişi ise alt dönemimden sevgili Duygu ÇAĞLAR 'dır. Kendisine belirttiğim gibi buradan sizlere de söylemek isterim ki okulu esnasında kendisine her konuda sınırsız destek sunacağım. Ayrıca okulu bittiği zaman da kendisini yardımcım olarak çalıştığım yerde işe aldırtacağım. Çünkü sektöründe bu kadar iyi kalpli ve öğrenme azmi olan insanlara ihtiyacı var. Kendisine söylediğim diğer birçok konuda desteğimi esirgemeyeceğim ve sevmediğim Trabzon 'a yalnızca Duygu ÇAĞLAR 'ı desteklemek için hafta sonları zaman buldukça gitmeye çalışacağım.
Ayrıca kendisinin de bana olan desteklerinden ötürü teşekkürlerimi sunuyorum. İnsanının rahatlıkla her konuda sohbet edebileceği bir arkadaşının olması çok güzel bir duygu. :) Teşekkürler Duygu...
Desteklediğim kişi kararımı asla değiştirmemek üzere DUYGU ÇAĞLAR 'dır. Bir yıl içerisinde kendisinin ismini çok sık biçimde duyacağınızdan emin olabilirsiniz.
Sonuç olarak okulla ilişkim kesildi. İstanbul 'a geri döndüm ve desteklediğim kişiyi belirledim. 1 - 2 haftaya kadar da çalıştığım şirketi ve pozisyonumu sizlere buradan duyuracağım. Tabii bunu yapmadan önce WPF - Temel Tipler ve sınıflar makalemi yayınlayacağım. Yaklaşık 16 gündür başlayıp bitirmediğim bir makaledir.
Herkesin yaşamında başarı olması dileğimle...
Cuma, Haziran 20, 2008
Free Silverlight Datagrid from DevExpress
The folks at DevExpress are releasing a FREE DataGrid for Silverlight.
Here are come of the features.....
- Data Grouping against multiple Silverlight Grid columns
- Data Sorting against multiple Silverlight Grid columns
- Comprehensive Summary Computation support against multiple Silverlight Grid columns
- Column Movement
- Column Resizing
- Column Auto-Width
- Row Editing
- Row Preview (with animation)
- Template Support (for cell content, cell editing, row preview and headers)
- Auto Height Support for cells, headers, and totals.
- Virtual StackPanel Row Container (simply means we are able to handle an unlimited number of rows)
- Focused Row and Focused Cell
- Multi-Row Selection Cell Text Wrapping
- Vertical/Horizontal Lines
- Multiple column types/editors
Pazartesi, Haziran 02, 2008
WPF - Text & Flow Document
Türkiye’ de ve bütün dünyada Windows Presentation Foundation tanıtımları yapılırken gösterilen ortak bir uygulama vardı. Demoda bir gazetenin internete başlanmadan videoları, resimleri ve içerikleri ile birlikte bilgisayarda kullanılmasına olanak tanıyan bir örnekti. Gösterilen demo New York Times Reader ‘dır. Uygulamada, yazılar belirli ölçülerde büyültülüp küçültülürken sayfalamalar ona göre otomatik olarak şekillendiriliyor, düzenli olarak güncelleme alabiliyor ve hem hızlı hem de görsel olarak son kullanıcının hoşuna gidecek animasyonlar sunuyordu. Kısacası geliştiriciler ve kullanıcılar bu uygulamayı fazlasıyla beğenmekteydi. Şimdi bu uygulama ve bu uygulama esas alınarak hazırlanan başka bir uygulamanın ekran görüntülerini aşağıda göreceksiniz. Bu uygulamaların ortak yanları;
• Windows Presentation Foundation ile yapılmış olmaları,
• Flow Document kontrolünün kullanılmış olması,
• İçeriklerinin web servisler ile otomatik olarak çekiliyor olması,
• Arama için gerekli olan sorgularında LinQ To SQL kullanmaları,
• Sayfa geçişlerinde ve arama işlemleri sonuçlarında animasyon kullanılması,
biçiminde sıralayabilmemiz mümkündür.
New York Times Reader
MSDN Libary
Yukarıda ekran görüntülerini gördüğünüz uygulamaların en belirgin özellikleri içeriklerinden bulunan metinlerin uygulamanın boyutuna göre kendisini otomatik olarak şekillendirmesidir.
Artık temel olarak metin ve flow document ile neler yapabileceğimize göz attığımıza göre bizlerde bu tür uygulamalar geliştirmek istediğimizde kullanabileceğimiz metin özelliklerini incelemeye başlayabiliriz.
Yazı Tipi ve Metin Stilleri
Metin ile ilgili işlemler ile uğraştığımızda bir çok aşamayı başarılı bir biçimde yapabilmemiz gerekmektedir. Fakat WPF ile sağlanan kolaylıklar ve bünyesinde barındırdığı bir çok yazı tipi stilleri sayesinde daha kolaylıkla yapabilmemiz mümkündür. Metin uygulamalarında altı çizili olması, kalın olması, eğik olması, farklı yazı tiplerinin kullanılabilmesi, boyutlarının kolaylıkla değiştirilebilmesi ve işletim sistemlerinin temalarından doğan sorunların oluşmaması gibi bir çok faktörü düşünerek hareket ederiz. WPF ile ise bahsettiğimiz bir çok faktörü HTML ile kod yazarken yaşadığımız kolaylık ile uygulayabiliyoruz.
Yaygın Metin Özellikleri
WPF ile hazırlamış olduğumuz uygulamalarda metinleri belirlediğimiz zaman TextElement sınıfını çağırmamız gerekmektedir. TextElement sınıfına dahil edilmiş birçok özelliği kullanarak en yaygın olarak kullanılan metin işlemlerini yapabilmemiz mümkündür. Şimdi bu sınıfı buton kontrolünün içerisinde nasıl kullanabileceğimizi basit bir örnek ile inceleyelim.
XAML Kod
| <Button TextElement.FontFamily="Parchment" TextElement.FontSize="80" Height="96" VerticalAlignment="Top"> Turhal Temizer </Button> <Button FontFamily="Parchment" FontSize="80" Height="96" VerticalAlignment="Bottom"> Duygu Çaglar </Button> |
XAML koddan dikkat edeceğiniz üzere TextElement sınıfı ile metin özelliklerine belirleyebilirken aynı zamanda direk yapmak istediğimiz metinsel değişikleri belirterek de yapabilmemiz mümkündür. İkisi arasında bir fark yoktur ve özellikler penceresinde yaptığımız işlemlerin sonucunun sorunsuz olduğunu görebiliriz.
Butonumuzun görüntüsünün nasıl gözüktüğüne görmek gerekirse,
iki butonda da belirttiğimiz yazı tipi ve boyutu sorunsuz bir biçimde uygulanmış olduğu görülür.
Text Element miraslaşarak oluşturulan özellikleri ve ne işe yaradıklarını aşağıdaki gibi listeleyebiliriz.
| Özellik | Kullanımı |
| FontFamily | Yazı biçimini belirler(Arial, Calibri, v.b.). |
| FontSize | Yazıların boyutlarını belirler. (XAML‘ de kullanabileceğimiz boyut standartları: in, cm, px, pt ‘dir. Bu kısaltmalar ayrıntılı olarak inç, santimetre, piksel, nokta.) Eğer herhangi bir standart girilmezse varsayılan olarak piksel kabul edilir. |
| FontStretch | Yazının gerginliğini belirler. Condensed, Normal ve Expanded değerlerini alır. |
| FontStyle | Yazınını stilini belirler. Italic ve Normal değerlerini alır. |
| FontWeight | Yazını genişliğini belirler. Normal, Bold ve Light değerlerini alır. |
| Foreground | Yazının rengini belirler. |
Daha öncede bahsettiğimiz gibi yukarıdaki özellikler kullanıcı kontrollerinde dahili olarak kullanılmaktadır ve TextElement sınıfının tekrardan çağırılmasına gerek yoktur.
Yazı ve Yazı Ailesi
Ortak kullanılan (FontFamily) yazı ailelerine ve tiplerine yer verilmiştir. Fakat FontFamily sınıfı kullanabileceklerimizden yalnızca biridir. WPF uygulamalarında sıklıkla kullanılan üç sınıfı ve kullanım biçimlerine ilişkin bilgiler aşağıdaki tablodadır.
| Sınıf | Kullanımı |
| FontFamily | Yazı tiplerini isimleri ile temsil eder. Arial, Calibri, Times New Roman v.b. yazı tipleri kullanılabilmektedir. |
| GlypTypeface | Diskimizdeki yazı tipini kullanır. C:\Windows\Fonts\timesbi.ttf gibi. Belirtilen yazı dosyasının içerisinden yazıya ilişkin stil, boyut ve diğer özellikleri bulunmaktadır. Yolunu verdiğimizde ise kalın, yassı ve stili Times New Roman dır. |
| Typeface | FontFamily özelliklerini kullanır. GlypTypeface ile oluşturulan görüntülenmeler Typeface ile tekrardan görüntülenebilir. |
Windows Presentation uygulamaları geliştirilirken sıklıkla kullanılan yazı ailesi FontFamily ‘dir. Diğer iki yazı ailesi ise genellikle tasarımcılar tarafından özelleştirilen yazı stillerinin kullanılması durumunda kullanılmaktadır. Fakat kullanım sıklığı ve kolaylığı göz önüne alındığında FontFamily ‘nin daha fazla kullanıldığı gözlenir.
Yazı Boyutu (FontSize)
Metin işlemlerinde kullanacak olduğumuz yazının boyutunu istediğimiz biçimde şekillendirmemize olanak tanır. Hangi değerler ile boyutlarını yaygın metin özellikleri başlığının altındaki tabloda incelemiştik. Şimdi bu değerleri nasıl kullanabileceğimize XAML kod ile göz atalım.
XAML kod
| <StackPanel> <TextBlock FontSize="40 px" Text="30 piksel"/> <TextBlock FontSize="40 pt" Text="30 nokta"/> <TextBlock FontSize="1.3 cm" Text="1.3 santimetre"/> <TextBlock FontSize="0.4 in" Text="0.3 inç"/> </StackPanel> |
Gerginlik (Stretch)
Metin uygulamalarında yer alan yazıların ekrandaki gerginliklerini belirlenmesine yarar. Kullanılan değerler FontStretches sınıfından çekilir. Bu değerler: UltraCondensed, ExtraCondensed, Condensed, SemiCondensed, Normal, Medium, SemiExpanded, Expanded, ExtraExpanded ve UltraExpanded dir.
Sıklıkla kullanılan yazı stillerinde gerginlik değeri olarak normal kullanılmaktadır. Eğer ki diğer özellikler kullanılırsa yatay olarak harfler ve rakamlar birbirlerine çok yaklaşacak ve okuma güçlüğüne sebep olacaktır. Örnek olarak MS Office ‘de yer alan yazı tiplerinden Gill Sans MT‘ yi deneye bilirsiniz. Harflerin birbirine yakın olmasından dolayı okunma oldukça zordur.
Stil (Style)
FontStyle özelliği ile kullanılmaktadır. Kullanabileceğimiz değerleri: Normal, Italic ve Oblique ‘dir. Metinlerde farklı gösterilmesi düşünülen kelimelerde uygulanır. Arial yazı ailesi ile yazmış olduğumuz bir yazıya stilleri uyguladığımızda oluşan sonuç aşağıdaki gibidir.
Weight
FontWeight özelliği metin uygulamalarındaki yazılarımızın daha koyu bir biçimde görülmesini sağlar. FontWeight sınıfında birçok değer kullanılmaktadır. Bunlar: ExtraLight/UltraLight, Light, Normal/Regular, Medium, DemiBold / SemiBold, Bold, ExtraBold / UltraBold, Black / Heavy ve ExtraBlack / UltraHeavy dir.
TextElement sınıfında kullanılmakla birlikte paragraf veya blok yazı alanlarında da kullanılması mümkündür. Metin belgelerinde genellikle önem sarf eden veya başlık olacak olan yazılarda sıklıkla kullanılmaktadır.
Decoration (Süsleme)
Decoration özelliği yazıların altını veya üzerine düz bir çizgi çizmeye yaramaktadır. Genellikle TextBlock içerisinde kullanılmaktadır. Ayrıca TextDecorations ile düz siyah çizgi çizmenin dışında belirli ölçülerde özelleştirebildiğimiz düzlemlerde çizilebilmektedir. Örnek vermek gerekirse;
| <TextBlock TextWrapping="Wrap" TextAlignment="Center" FontSize="18"> <Span TextDecorations="Underline">Turhal Temizer, </Span> <Span TextDecorations="Baseline"> Duygu Çağlar, </Span> <Span TextDecorations="Strikethrough">Gövdesinde, </Span> <Span TextDecorations="Overline">Üzerinde, </Span> <Span TextDecorations="Underline, Baseline, Strikethrough, Overline">Hepsi</Span> </TextBlock> |
Şimdi ki örneğimizde ise standart siyah çizgini yerine mavi renkli kalın bir çizgiyi nasıl oluşturabileceğimize göz atacağız.
| <TextBlock Margin="0,74,0,-74" FontSize="38" TextAlignment="Center"> <Span> <Span.TextDecorations > <TextDecoration Location="Underline" PenOffset="4"> <TextDecoration.Pen> <Pen Brush="Blue" Thickness="1"/> </TextDecoration.Pen> </TextDecoration> <TextDecoration Location="Strikethrough"> <TextDecoration.Pen> <Pen Brush="LightGreen" Thickness="1"/> </TextDecoration.Pen> </TextDecoration> </Span.TextDecorations> Turhal Temizer </Span> </TextBlock> |
Windows Presentation Foundation da TextDecoration işlemlerini XAML kod yardımı ile ne kadar kolay yapabileceğimizi öğrenmiş olduk.
Text Wrapping & Hyphenation ( Metin aktarma ve Kesikli çizgi )
Son kullanıcılara sunulan uygulamalarda genellikle doldurmalı alanlar kullanıcılar tarafından uygulama alanının genişliğinden daha fazla yer kullanarak taşmasına sebep olmaktadır. Bu tür sorunları ortadan kaldırmak için kullanıcıya sunulan kontrolün genişliği tamamlandı ise bir alt satıra geçirilmesi için ufak ayarlamalar yapılırdı. WPF ‘de bu işlemleri iki biçimde yapabilmemiz mümkündür. Bunlardan birincisi TextWrapping ‘tir.
TextWrapping özelliği yazı yazdırılan satır dolmuş ise bir alt satıra geçmesine olanak tanımaktadır. Örnekler ile bu özelliği incelemek çok daha yararlı olacaktır.
TextWrapping özelliğini kullanmadan,
| <TextBlock TextWrapping="NoWrap" Text="Turhal Temizer, Istatistik ve Bilgisayar Bilimleri, Karadeniz Teknik Universitesi"/> |
TextWrapping özelliğini kullanarak,
| <TextBlock TextWrapping="Wrap" Text="Turhal Temizer, Istatistik ve Bilgisayar Bilimleri, Karadeniz Teknik Universitesi"/> |
TextWrapping özelliğinin üçüncü değeri ise WrapWithOverflow ‘dur. Bu değer daha çok geniş boyutlu uygulamalarda Wrap ‘a göre daha iyi performans vermektedir.
TextWrapping özelliği ile birlikte kullanabileceğimiz Hyphenation özelliği kelimeleri satıra sığabilecek kadar uzatır ve sığmayan kısmına kesikli çizgi “-” koyarak bir alt satırda kaldığı yerden devam etmektedir. Örnek olarak göstermek gerekirse,
| <TextBlock TextWrapping="Wrap" IsHyphenationEnabled="True" Text="TextWrapping özelliği kullanabileceğimiz Hyphenation ..."/> |
Text Alignment ( Metin Hizalaması )
Yazıların sağa sola, ortaya veya her iki yana yaslı olarak yazılmasına olanak tanınmaktadır. Bu işlemin gerçekleşebilmesi için TextAlignment özelliğine right, left, justify ve center özelliklerinden herhangi birinin girilmesi yeterlidir. Özelliğin uygulamalarını sıklıkla MS Office ‘te görebiliriz. İlk açılan belge sağa yaslı olarak yazmaya başlarken biz onu sayfanın istediğimiz yerinde başlamasına olanak sağlarız.
Metin ve Kullanıcı Arayüzü
WPF uygulamalarında tasarım mimarisi kullanıcı kontrollerinin kullanımı üzerine kurulmuştur. Hiyerarşinin gerçekleşmesinden kullanılan sınıflardan biri Glyph sınıfıdır. System.Windows.Forms.Design.Behavior isim alanından miraslaşarak oluşturulmuştur. Kullanılan kontrollerin form üzerinde gösterdiği özelliklere göre düzenlenmiştir. Hiyerarşinin en üst kademelerinden birinde yer alan Glyph sınıfı ile birlikte GlyphRunDrawing sınıfı kullanılmaktadır. System.Windows.Media isim alanından miraslaşmıştır. Kullanılan sınıfların modellenmesi ile metin işlemlerinde kullanabileceğimiz TextBlock ve FlowDocumentReader kullanıcı kontrolleri bizlere sunulmuştur. Şimdi sıklıkla kullanılan metin kontrollerini incelemeye çalışalım.
TextBlock
TextBlock kontrolü genellikle basit metinlerin görüntülenmesinde kullanılmaktadır. Birkaç kelimelik cümlelerin yazımında yazı stillerinin özelleştirilmesi gibi özellikleri kullanabilmemiz mümkündür. Basit olarak TextBlock kontrolünün nasıl kullanacağını gösterirsek,
| <TextBlock Text="Turhal Temizer"/> |
XAML kod bloğu biçimindedir. TextBlock kontrolünün form üzerinde nerede duracağı FrameworkElement yardımı ile belirtilebilmektedir. Ayrıca WPF formda Grid alanı yerine StackPanel kullanırsak ta kullanmış olduğumuz yazılar ve kontroller biz aksini belirtmediğimiz sürece alt alta dizilecektir.
TextBlock ‘ta çoklu satırda kullanılabilmektedir. Fakat kullanımı için doğru karakterleri kullanabilmesi gerekmektedir. .Net ‘te Environment.NewLine özellikleri yardımı ile kullanılması mümkündür. Karakterler kullanılarak hazırlanmış TextBlock kontrol örneği aşağıdadır.
| <TextBlock Text="Turhal
 Temizer" /> |

 kullanıldığı taktirde bitiminden sonraki kelimenin bir alt satırdan başlamasını sağlamaktadır.
TextBlock kontrolleri kullanılırken yazı ailesi ve stillerde kullanılabilmektedir. Ayrıca içerik olarak belirttiğimiz metinleri <TextBlock> tagları arasında kullanabilmemiz mümkündür.
| <TextBlock>Turhal Temizer</TextBlock> |
Metinlerde öncelikli olarak göstermemiz gereken kelimeleri kalın olarak göstermek isteyebiliriz. Bunun için yapmamız gereken HTML kodda olduğu gibi Bold tagını kullanmak olacaktır (HTML ‘de bold tagı strong biçiminde kullanılmaktadır).
| <TextBlock><Bold>Turhal Temizer</Bold></TextBlock> |
Metin modellerinde kullanabileceğimiz stilleri yukarıda ayrıntılı bir biçimde açıklamıştık. Bahsettiğimiz özelliklerin hepsi TextBlock modeli içerisinde kullanılabilmektedir.
Label ve AccessText
Label, etiket olarak göstermek istediğimiz metinlerde sıklıkla kullanılmaktadır. Özellikle Windows Form ‘larda kullanıcı tarafından değiştirilmesini istemediğimiz metinleri kullanırken en sık tercih edilen kontroldü. Aynı şekilde bu kontrol TextBlock ile birlikte WPF form uygulamalarında da yerini almıştır. Fakat en belirgin farkı istediğimiz bir harfi klavyeden alt karakterine bastığımızda altı çizili olarak gösterebilmemizdir. Bu kullanım şeklini Windows Form ile yapmak istediğimizde kullandığımız karakterlerin hepsini ekranda göstermektedir. Altı çizili olarak gösterebilmek için istediğimiz bir harfin önüne “-” karakterini koymamız yeterli olacaktır.
| <Label FontSize="20" Content="D_uygu Çağlar Label"/> |
Label gibi kullanacağımız bir diğer kontrolde AccessText ‘tir. Bu kontrolde label gibi çalışmakla birlikte ilk kullanışta göze çarpan ilk farkı WPF formun en köşe noktasından başlıyor oluşudur. Label kontrolü en köşe noktadan bir boşluk mesafede metinleri göstermektedir. Kullanımda olmasa da metinleri girerken XAML kod tarafında ufak bir değişiklik ile metinleri girmek gerekmektedir. Label kontrolünden metinleri Content özelliği ile girerken AccessText kontrolü ile Text özelliği ile girmemiz gerekmektedir.
| <AccessText Text="T_urhal Temizer AccessText"/> |
İki kontrolün klavyeden alt karakterine basılması sonucunda aldığı ekran görüntüsü aşağıdaki gibi olacaktır.
FlowDocument
Flow Document kontrolü WPF ile gelen en büyük yeniliklerden biridir. Biraz önce bahsettiğimiz metin girme kontrolleri temel olarak uzun olmayan metinlerin girilmesinde kullanılmaktadır. Fakat paragraflarca metinlerin uygulamamıza eklenmesini istediğimizde o kontroller yeteri verimi verememektedir. Bu durumda bizlerin yapması gereken satır sonlarına geldiğinde düzenli olarak bir alt satıra geç, kullanıcı yazıyı büyütmek ve küçültmek istediğinde olabilmesi için kontroller yaz ve bunun gibi daha birçok işlemi yapmamız gerekmekteydi. Bunun yerine FlowDocument kontrolü kullanarak daha uygulamanın temellerinden karşılaşacağımız bir çok sorunu halletmiş oluruz.
Ayrıca ufak bir noktaya değinmek gerekirse, WPF form ile hazırlanmış uygulamalarda içerikleri gösterirken verilerin XML ile birlikte XPS (XML Paper Specifition) belgelerden çekildiğinden de bahsedilmektedir. Peki bu XPS doküman nedir? Şubat ayı itibari ile değiştirilemez doküman kategorisinde PDF ‘in yerine standart olarak kabul edilmiş bir belge türüdür. Kabul esnasında PDF ‘in kabul oranına nazaran çok daha yüksek bir oranla kabul edilmiştir. Belgeleri göstermek için internet tarayıcıları kullanmakta ve kullanımında kullanıcılara sunduğu işlemleri Flow Document ile gerçekleştirmektedir. Ayrıca Windows Vista ile hazırlanan belgeler XPS ile ve bu işletim sisteminin çıkması ile yaygınlaşmıştır. Microsoft ürünü olmakla birlikte diğer yazılım ve bilişim firmalarının da istediği bir belge standardıdır. Yalnızca lisans alım aşamasında Microsoft ‘un diğer firmalardan daha aktif davranmasından ötürü kendi bünyesine dahil etmedir.
XPS kullanımı esnasında API olarak System.IO.Packaging dönüşümünü kullanmaktadır. Daha ayrıntılı bilgi edinmek için ise http://www.microsoft.com/xps adresinden yararlanabilirsiniz.
FlowDocument oluştururken nasıl bir yol izlememiz gerektiğini örnek üzerinden anlatacağız. Bu işlem için <FlowDocument> kontrolü ve her paragraf için <Paragraph> üyesini kullanmamız gerekecektir.
| <FlowDocument> <Paragraph FontSize="22">Text ile FlowDocument</Paragraph> <Paragraph FontSize="30">Flow Document</Paragraph> <Paragraph>Flow Document kontolü WPF ile …. </Paragraph> <Paragraph>…</Paragraph> <Paragraph>..</Paragraph> </FlowDocument> |
Flow Document kontrolünü kullanarak aramadan, boyut arttırmaya kadar birçok işlemi bir arada yapmamıza olanak tanınmaktadır. Bu işlemler esnasında yazı stillerinden sağa ve sola dayalı olması yazılar büyüdüğünde formumuza göre otomatik olarak şekillendirilmesi gibi bir çok özelliği otomatik olarak yapmaktadır.
Flow Document ile kullanabileceğimiz blokları aşağıdaki gibi listeleye biliriz.
| Blok | Kullanımı |
| Paragraph | XAML kod bloğundan FlowDocument kontrolüne metin eklememize olanak tanır. Eklemiş olduğumuz metinler basit metinler olmalıdır. Sınırsız sayıda kullanılabilir. Diğer bloklar ile iç içe kullanılabilmektedir. |
| Section | Diğer bloklara çeşitli özellikler atanmasına yarar. Diğer bloklara belirginlik, arka plan, yazı rengi ve buna benzer özellikleri belirlenmesinde yarar. Taglar içerisinde yazı metin yazılamaz. Paragraph gibi metin bloklarını kapsayacak biçimde tanımlanabilir. |
| List | Listeleme yapılması için sıralı numara, roma rakamı, kalın nokta gibi standart listeleme simgelerinin kullanılmasına olanak tanır. |
| Table | Belgelerde tablo ile gösterime ihtiyaç duyulduğunda kullanılmaktadır. |
| BlockUIContainer | FlowDocument içerisine son kullanıcılara hitaben resim, video, buton ve üç boyutlu nesneler eklenmesine olanak tanır. |
FlowDocument içerisinde kullanılabilecek blokların hepsinin ortak biçimde kullanıldığı bir örnek hazırlayalım. Örneğimizde başlığın arka plan rengi, listeli metin, BlockUIContainer ve tablo bulunacaktır.
XAML kod
| <Window x:Class="mak43.Window8" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="Flow Document"> <!--Kapsamlı örnek--> <FlowDocument> <Section LineHeight="2" Foreground="White" Background="Black"> <Paragraph FontSize="22">Windows Presentation Foundation</Paragraph> <Paragraph FontSize="30">Kısa Açıklamalar</Paragraph> </Section> <Paragraph>WPF: Ön plana çıkan özellikleri</Paragraph> <List> <ListItem> <Paragraph>Uygulama ile uyumu</Paragraph> </ListItem> <ListItem> <Paragraph>Çözünürlüğe bağımlılığı</Paragraph> </ListItem> <ListItem> <Paragraph>Donanımlar ile uyumu</Paragraph> </ListItem> <ListItem> <Paragraph>Bildirimli programlama</Paragraph> </ListItem> <ListItem> <Paragraph>Özelleştirelebilir zengin kontroller</Paragraph> </ListItem> </List> <BlockUIContainer> <Viewbox> <StackPanel Orientation="Horizontal"> <Image Source="yapi.jpg" Margin="5"/> <TextBlock VerticalAlignment="Center" Width="100" TextWrapping="Wrap"> .Net Framework 3.0 teknolojisinden bulunanlar. </TextBlock> </StackPanel> </Viewbox> </BlockUIContainer> <Paragraph> .Net 3.0 yapısının tablo ile gösterimi </Paragraph> <Table CellSpacing="5" Padding="15" FontFamily="Segoe UI"> <Table.Background> <LinearGradientBrush> <GradientStop Color="Yellow" Offset="0"/> <GradientStop Color="Orange" Offset="1"/> </LinearGradientBrush> </Table.Background> <!-- dört sütün oluşturuluyor: --> <Table.Columns> <TableColumn/> <TableColumn/> <TableColumn/> <TableColumn/> </Table.Columns> <!-- üç satır oluşturuluyor: --> <TableRowGroup> <TableRow> <TableCell ColumnSpan= "4" TextAlignment="Center"> <Paragraph FontWeight="Bold">.NET Framework 3.0</Paragraph> </TableCell> </TableRow> <TableRow> <TableCell BorderBrush="Black" BorderThickness="2" Background="LightGray" TextAlignment="Center" LineHeight="70"> <Paragraph FontWeight="Bold">WPF</Paragraph> </TableCell> <TableCell BorderBrush="Black" BorderThickness="2" Background="LightGray" TextAlignment="Center"> <Paragraph FontWeight="Bold">WCF</Paragraph> </TableCell> <TableCell BorderBrush="Black" BorderThickness="2" Background="LightGray" TextAlignment="Center"> <Paragraph FontWeight="Bold">WF</Paragraph> </TableCell> <TableCell BorderBrush="Black" BorderThickness="2" Background="LightGray" TextAlignment="Center"> <Paragraph FontWeight="Bold">WCS</Paragraph> </TableCell> </TableRow> <TableRow> <TableCell BorderBrush="Black" BorderThickness="2" Background="LightGray" TextAlignment="Center"> <Paragraph FontWeight="Bold">ADO.NET</Paragraph> </TableCell> <TableCell BorderBrush="Black" BorderThickness="2" Background="LightGray" TextAlignment="Center"> <Paragraph FontWeight="Bold">ASP.NET </Paragraph> </TableCell> <TableCell BorderBrush="Black" BorderThickness="2" Background="LightGray" TextAlignment="Center"> <Paragraph FontWeight="Bold">Windows Forms</Paragraph> </TableCell> <TableCell BorderBrush="Black" BorderThickness="2" Background="LightGray" TextAlignment="Center"> <Paragraph FontWeight="Bold">...</Paragraph> </TableCell> </TableRow> </TableRowGroup> </Table> </FlowDocument> </Window> |
Oluşturmuş olduğumuz uygulamanın boyutlarını değiştirdiğimiz taktirde uygulamamızın içerisinde yer alan metinlerde otomatik olarak şekillenecektir.
Span
Yazı stillerinde anlatırken altı çizili, kalın, yassı yazıların nasıl oluşturulacağından ayrıntılı bir biçimde değinmiştik. FlowDocument ile bu özellikler kullanılmak istendiğinde nasıl bir kullanım izleneceğine değinmeye çalışalım. Yazı ile anlatırken TextBlock kontrolü içerisinde nasıl kullanılacağından değinmeye çalışmıştık. Şimdi ise Paragraph bloğu arasında kullanacağız.
XAML Kod
| <FlowDocument> <Paragraph> <Bold>Kalın</Bold> <Italic>Yassı</Italic> <Underline>Altında</Underline> <Hyperlink>Link</Hyperlink> <Span BaselineAlignment="Superscript">SıuperScript</Span> <Span BaselineAlignment="Subscript">SubScript</Span> <Span> <Span.TextDecorations> <TextDecoration Location="Strikethrough"/> </Span.TextDecorations> Strikethrought </Span> </Paragraph> <Paragraph> a <Bold>b <Italic>c <Underline>d <Hyperlink>e</Hyperlink> f</Underline> g</Italic> h </Bold> i </Paragraph> </FlowDocument> |
Sabit Bloklar
FlowDocument içerisine yerleştirmiş olduğumuz resim, videoların blok içerisinden nerede duracağını belirlememize olanak tanırlar. Sayfanın boyutunun değişmesi sonucunda oluşan görüntü bozukluklarını ortadan amaçlar. Ufak bir örnek ile nasıl kullanıldığına göz atalım.
| <FlowDocument> <Paragraph FontSize="22">Windows Client</Paragraph> <Paragraph FontSize="30">WPF 'in Form Dünyasındaki Yeri</Paragraph> <Paragraph> <Figure Width="130"> <BlockUIContainer> <Image Source="Turhal11.jpg"/> </BlockUIContainer> </Figure> Windows Presentation Foundation … </Paragraph> <Paragraph>Windows Form …</Paragraph> <Paragraph>…</Paragraph> <Paragraph>…</Paragraph> <Paragraph>…</Paragraph> <Paragraph> Tabii bu yalnızca bir görüş. Bize doğrusunu zaman gösterecektir. </Paragraph> <Paragraph> <Bold>Turhal Temizer</Bold> </Paragraph> </FlowDocument> |
FlowDocument ‘e eklemiş olduğumuz resim varsayılan olarak formun ilk sütununun sağ köşesine eklenmiştir. Eğer biz resmin yerine değiştirmek istiyorsak yapmamız gereken VerticakAnchor ve HorizontalAnchor değerlerini belirlemek olacaktır. Örnekler ile sonuçlarına göz atalım.
HorizontalAnchor="ColumnLeft"
HorizontalAnchor="PageCenter"
HorizontalAnchor="PageRight" ve VerticalAnchor="PageTop"
FlowDocument Görüntüleme
FlowDocument ile açıklamaları anlatırken hazır kontrolün özelliklerini kısıtlayabileceğimizden de bahsetmiştik. Uygumalarımızın sağ alt köşesinde görüntüleme ile ilgili üç adet seçenek çıkmaktadır. Eğer geliştiriciler isterse bu üç kontrolden herhangi birini XAML kod bloğunda FlowDocument tagından önce yazarak varsayılan olarak uygulatabiliriz ve değiştirilmesini engelleyebiliriz.
Görüntüleme ile ilgili üç seçeneğin ne işe yaradığını aşağıdaki tabloda ayrıntılı bir biçimde öğrenebilirisiniz.
| Görütüleme | Görevi |
| FlowDocumentScrollViewer | Belgelerin web sayfalarında veya MS Word ‘de olduğu gibi aşağı yukarı kaydırma çubuğu ile hareketlenebilmesini sağlar. |
| FlowDocumentPageViewer | MS Word ‘de tam ekran belgeleri okurken gözlemlenen yapının aynısı çalıştırılır. |
| FlowDocumentReader | Diğer iki görüntülemenin özelliklerinin birleşimi biçimindedir. Kullanıldığı taktirde diğerlerinden farklı olarak arama çubuğuda aktif olmaktadır. |
| <FlowDocumentScrollViewer> <FlowDocument> ……………………… </FlowDocument> </FlowDocumentScrollViewer> |
| <FlowDocumentPageViewer> <FlowDocument> ……………………… </FlowDocument> </FlowDocumentPageViewer> |
| <FlowDocumentReader> <FlowDocument> ……………………… </FlowDocument> </FlowDocumentReader> |
Dipnot Ekleme
FlowDocument ile hazırlanmış uygulamalara göz attığımızda dipnot ekleme gibi seçeneklerin bulunduğunu gözlemleriz. WPF, FlowDocument kontrolünde kullanabilmemiz için dipnot ekleme ve önemlilik belirleme gibi kontrolleri bizlere sunmuştur. Özellikleri kullanabilmemiz için Annotation sınıfını kullanabilmemiz gerekmektedir. Bunun için ise System.Windows.Annotations isim alanının uygulaya eklenmesi gerekmektedir. Dipnot işlemleri esnasında aşağıdaki kontrolleri kullanabilmemiz mümkündür.
| Komut | Kullanımı |
| CreateTextStickyNoteCommand | Eklenmesi durumunda seçili metnin üzerine gelindiğinde yazı olarak not eklenmesini sağlar. |
| CreateInkStickyNoteCommand | Eklenmesi durumunda seçili metnin üzerine gelindiğinde çizerek not eklenmesini sağlar. |
| DeleteStickyNoteCommand | Etiket olarak eklenen dipnotları silmeyi sağlar. |
| CreateHighlightCommand | CreateHighlightCommand |
| ClearHighlightCommand | Renklendirilmiş metnin temizlenmesini sağlar. |
Yukarıdaki komutları kullanarak FlowDocument uygulamamızı özelleştirelim.
Uygulamamıza başlarken ilk yapacak olduğumuz işlem System.Windows.Annotations isim alanını eklemek olacaktır.
Daha sonrasında ise aşağıdaki XAML kodları ekliyoruz.
XAML kod
| <Window x:Class="mak43.Window10" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:a="clr-namespace:System.Windows.Annotations;assembly=PresentationFramework" Title="Dipnot" Initialized="Window_Initialized" Closed="Window_Closed"> <StackPanel> <StackPanel Orientation="Horizontal"> <Label>Dipnot Kontrolleri</Label> <Button Command="a:AnnotationService.CreateTextStickyNoteCommand" CommandTarget="{Binding ElementName=reader}">Yazılı Not</Button> <Button Command="a:AnnotationService.CreateInkStickyNoteCommand" CommandTarget="{Binding ElementName=reader}">Çizimli Not</Button> <Button Command="a:AnnotationService.DeleteStickyNotesCommand" CommandTarget="{Binding ElementName=reader}">Not sil</Button> <Button Command="a:AnnotationService.CreateHighlightCommand" CommandTarget="{Binding ElementName=reader}" >Üstünü çiz</Button> <Button Command="a:AnnotationService.ClearHighlightsCommand" CommandTarget="{Binding ElementName=reader}">Üstünü temizle</Button> </StackPanel> <FlowDocumentReader x:Name="reader"> <FlowDocument> <Paragraph FontSize="22">Windows Client</Paragraph> <Paragraph FontSize="30">WPF 'in Form Dünyasındaki Yeri</Paragraph> <Paragraph> <Figure Width="130" HorizontalAnchor="PageRight" VerticalAnchor="PageTop"> |