Sunday, January 31, 2016

Köpek

Köpek bile ârif olunca Eshâb-ı Kehif'ten olur.

Mevlana

Google Webmaster Araçları 2

Bu yazıda GOOGLE tarafından geliştiricilere sunulan bir önemli araçtan daha bahsedeceğiz. Bazı durumlarda tarama motorları tarafından bazı URL'lerin indexlenmemesi istenebilir. Bu durumda kullanılabilecek çeşitli yöntemler vardır. Bunlar şunlardır:

1. Robots.txt kullanmak
2. Meta Etiket kullanmak
3. Ulaşılmasını istemediğiniz kaynağı şifreli dizine koymak
4. Webmaster araçlarını kullanmak.

Burada robots.txt ile meta etiketlerin çalışma mantığı birbirleriyle aynıdır. Bunlar dönüşlü fonksiyonlardır. Robots.txt dosyasını daha önce yazdığım için şimdi meta etiketlerden örnek vereyim:

Eğer tüm robotların kaynağı indexlemeleri engellenmek istiyorsa şu meta etiket kullanılmalıdır:

<meta name="robots" content="noindex">

Eğer sadece googlebot'un kaynağı indexlemesi engellenmek isteniyorsa şu etiket kullanılmalıdır:

<meta name="googlebot" content="noindex">






3. yöntemde dizine şifre koymak sadece robotları değil diğer site kullanıcılarını da etkileyecektir. Bu sebeple ihtiyaca göre tercih edilmelidir.

4. yöntem google tarafından sunulan webmaster araçlarını kullanmaktır. Aşağıda gösterildiği gibi webmaster menüsünden "URL'leri Kaldır" sayfasına giriş yapınız. Aşağıdaki sayfaya giriş yaptıktan sonra geçici olarak gizle tuşuna basıp engellemek istediğiniz URL'yi giriniz.






Mal-Mevki

Ey iyi huylu kişi, gulyabani sesi nasıldır? "Mal isterim, mevki isterim, şeref isterim!" işte böyle. İçimden bu sesleri menet de sırlar keşfedilsin.

Mevlana

Kör

Körler, Kuran'ın harflerini ezberlemişlerdir. Eşeği görmezler de semeri dövüp durular! Gözün açıksa kaçan eşeği gör; ey puta tapan, niceye dek semercilik?

Mevlana

Thursday, January 28, 2016

Google Webmaster Araçları 1

Google, geliştiricilerin web sitelerini idexleyebilmesi, kullanılan robots.txt gibi dosyaların testlerini yapabilmeleri ve vb. işlemler için webmaster araçlarını oluşturmuştur. İçinde bir çok araç bulunan bu platform içindeki en önde gelen iki araçtan biri olan robots.txt dosyasının testi aşağıda gösterilmiştir.
Örnekte URL olarak blog sitesinin bir adresi gönderilmiş ve erişime izin verildiği anlaşılmıştır. Ayrıca sağ alt tarafta yer alan "Gönder" tuşu kullanılarak Google robots.txt dosyasının değiştiği konusunda haberdar edilebilir ve yeniden okuması istenebilir.





Aşağıdaki örnekte blog sitemize ait sitemaplar Google tarafından blog içeriğininin indexlenmesinin sağlanması amacıyla Google'la bildirilmektedir. Sitemap gönderildikten sonra bir hata olmadıysa sitemap grafik altında yer alan listede listelenecektir. Belli bir süre geçtikten sonra sitemap içinde yer alan ve sıkıntısız olan kaynaklar indexlenecektir.


Çalışmak

Çalışıp kazanmak define bulmaya mâni değil ya. Sen işten kalma da nasibinde varsa define de arkandan gelsin. Böyle yap ki "Eğer" illetine uğramayasın, "Eğer şunu yapsaydım, yahut bunu yapsaydım" deyip tereddüde düşmeyesin. Çünkü halkla hoş geçinen peygamber "Eğer" demeyi menetti, "Onu söylemek münafıklıktandır" dedi.

Mevlana

Wednesday, January 27, 2016

7 Büyük Günah

7 büyük günah Hristiyanlıkta kesinlikle kaçınılması gereken günahlar olarak tanımlanmaktadır. Müslümanlıktaki 7 büyük günahtan farklı olarak bu insan karakteriyle yakından ilişkili kavramları içerir. Aşağıda wikipedia'dan aldığım liste 7 büyük günahı ve onlarla ilişkili kötü varlıkları göstermektedir. 7 büyük günah ile ilgili seven isminde Morgan Freeman ve Brat Pitt'in paylaştığı sonu mutlu bitmeyen bir film de vardır.

  1. Superbia (İng. pride): Kibir, kendini beğenmişlik (Lucifer'e atfedilmiştir)
  2. Avaritia (İng. greed): Açgözlülük (Mammon'a atfedilmiştir)
  3. Luxuria (İng. lust): Şehvet düşkünlüğü (Asmodeus'a atfedilmiştir)
  4. Invidia (İng. envy): Kıskançlıkhasetlik (Leviathan'a atfedilmiştir)
  5. Gula (İng. gluttony): Oburluk (Beelzebub'a atfedilmiştir)
  6. Ira (İng. wrath): Öfke, yıkıcılık, gazap etmek (Behemoth'a atfedilmiştir)
  7. Acedia (İng. sloth): Tembellik, miskinlik (Belphegor'a atfedilmiştir)

Haset

Ebucehil, Muhammet'e uymaya utandı, hasedinden kendisini yüceltmeye, ondan yüksek olmaya çalıştı. Adı Ebu'l Hakem'di. Ebu cehil oldu. Nice ehliyetli kişiler vardır ki haset yüzünden naehil olup kalmışlardır.

Mevlana

Tuesday, January 26, 2016

Sofi 2

Dünyada tamahsız sofi hayli hor, hakirdir. Ancak Allah nuruyla doyan ve dinlenme zilletinden kurtulmuş olan sofi, bundan müstesnadır. Fakat sofilerin binde biri bu çeşit sofilerdendir. Öbürleri de onun sayesinde yaşarlar.

Mevlana


Hayal Etmek

Ademoğlu, hayalle gelişir. Hayalleri güzelse onunla rahatlaşır.

Mevlana

Kusur

Herkes, önce kendi kusurunu görseydi halini ıslah etmekten gaflet eder miydi?

Mevlana

Otağ

Türk sağ oldukça mutlaka kendisine bir otağ bulur, hele Hak kapısının azizi olursa.

Mevlana

Geçim Kaygısı

Gönlüne geçim kaygısını az koy, sen kapıda oldukça rızkın azalmaz.

Mevlana

Cahil

Cahil yolda daima çarpık, daima yampiri gider.

Mevlana

Sofi

Boğazına düşkün, yemeye alışkın sofiler, köpek gönüllüdürler, fakat kedi gibi yüzlerini yıkarlar, temiz görünürler.

Mevlana

Yaşamak

Herkes doğrularıyla yaşar pişmanlıklarıyla ölür.

Dost

Dost dediğin kudret aynasında zuhur edendir.

Devlet

Devlet, kıyamet sıcağında milletine gölge eden varlıktır. Devlet ne kadar büyük olursa millet de o kadar geniş yerde yaşar. Bu gölgeden ayrılan kaybolur.

Yalaka

Bazıları sonradan yavşak olur 
Bazıları da doğuştan yavşaktır. 
Bunlardan sürekli şak şak diye ses çıkar.

Kibir

Yükseldikçe önce insanlar küçülür, sonra Dünya küçülür kaybolur.

Demokrasi

Eşeğe demokrasi yaparsan eşek yürümez.

Saat Müzesi

Bugün Dolmabahçe sarayını gezdim. Çıkıştan hemen önce saat müzesine girdim. Baktım ki içerde kimse yok, müzeyi sonuna kadar rahat rahat gezeyim dedim. Müze genellikle fransız ve ingiliz yapımı antika saatlerden oluşuyordu. Müze boş olduğu içindir sanırım farkettim ki ses yankı yapıyor. Mimar Sinan misali akustik denemesi yapıyım dedim bari zaten kimse yok içeride. İki kere el çarptım. Birde baktım ki güvenlikte çalışan biraz yaşlıca sevimli dayımız garip garip bakıyor. Çıkarken sormadı ama akustik denemesi yapıyordum dedim. Dayımız da bunun üzerine zaten buraya normaller gelmiyor dedi.

Ayrılık

İnsan dünyadan ağlayarak ayrılıyorsa hiç bir şey değişmemiş demektir.

Anlamak

Anlayamamak kusurdan sayılmaz. Ama anlamamak başka...

Zahir

Ahlak bertaraf olmuş insanlık bitaraf,
Her yalanın ardında bir şeytan vardır.
Güzellik olağan olmuş ününü kaybetmiş,
Her güzelin üstünde bir şeytan vardır.

Zahire aldanma ey gönül!
Kim bilir ardında ne gerçekler vardır.
Gördüğüm zahirse asıl olan nedir?
Her asılın üstünde gerçekler vardır.

Görmek

İstisnasız herkesin kör olduğu bir toplumda yaşasaydınız ve sadece sizin gözleriniz bir anda açılsaydı diğerlerini görebildiğinize kolayca ikna edebilir miydiniz?

İnanmak

Hayallerimizi inançlarımızın üzerine kurduk,
İnançlarımızı da hayallerimizin üzerine.

Ufuk

Ufkun arkasını görememek ardında bir şey olmadığı anlamına gelmediği gibi
Aklın almaması ötesinde bir şeylerin olmadığı anlamına da gelmez.

Adam Olmak

Sorunlu bir asker için babasının söylediği söz:

"Onun yanında kuran okutun belki adam olur."

Asker

Askerin bir tanesinin kafasında yara gördüm ve sordum:
Ben: Kafana ne oldu?
Asker: Duvara vurdum komutanım!
Düşünme zamanı için sessizlik ve sonra:
Ben: Niye vurdun?
Asker: Sıkıntıdan işte komutanım!
Ben: Duvarın bir suçu var mıydı?
Asker: Yoktu komutanım!
Ben: Kafanın bir suçu var mıydı?
Asker: Yoktu komutanım.
Ben: Senin bir suçun var mıydı?
Asker: Vardı komutanım!

Balon

Fatih asteğmenle nizamiyeden çıkış yaparken nizamiyenin önünde kırmızı başıboş bir balon gördüm ve:
Ben: Fati git şu balonu üstüne otur da patlat.
Fatih Asteğmen: Olm ben 1 ay sonra Teğmen olacam benimle böyle konuşma.
Beni yine bir gülme tuttu ve:
Ben: Fati nizamiyenin önünde balon olması garibine gitmedi de teğmenin üzerine oturup patlatması mı garibine gitti.

Ortadaki

Buradakinin "A" dediği aynı şeye ötedekinin "B" dediği yerde ortadaki de "AQ" der.

Yanlış

Bir şeye yanlış demek kolaydır, zor olan doğru demektir.

Er Meydanı

Kılıç sallamayı bilmiyorsan er meydanına çıkmayacaksın.

Okumak

Kitap okumakla adam olunmaz, okumakla olunur...

Kötü Söz

Kötü söz doğruysa suç sayılmaz.

Siyah

Siyah da tertemizdi, insanlar kirletti.

Savaş

Yeryüzünde insanlar,
Yeraltında şeytanlar;
Dünyalıklar için birbirine giriyor.

Dua

Bizim kimsenin duasına da ihtiyacımız yok,
Bize gökyüzünde uçacak yer çok.

Özlem

Bilirim ki sen beni özlersin, 
Ama ben seni özlemem,
Üzülme, ben kimseyi özlemem.

Hüsn-ü Hülya

Bu günkü mutluluğum bir hüsn-ü hülyadandır,
Şaşırtır manzarası, belli ki arş-ı âlâdandır.

Nemrut

Çöl diyarında bülbüle gül bulunur mu?
Ateş bile İbrahim'e gülizar olunca,
Hiç Nemrut'a af olunur mu?

Devlet Adamlığı

Benim bu sözüm,
Ağır bir sözdür,
Bir ithamdır.
Anlamayana,
Yer yarılsa ne yazar!
Gök yıkılsa ne yazar!
Devlet Adamlığıyla Vatan Hainliği arasında ne vardır bilir misin?
Sırat köprüsü vardır.

Tabiat

Çakal çakalla gezer,
Aslan aslanla gezer.
Hükm-ü tabiatın çakala kaldığı yerde,
Aslana asî denir, çakala makbûl.

Subay

İnsanoğlu ne garip, yıldızlara ulaşmışlar!
Toprağı bırakıp ateşe sarılmışlar.

İnsan

Bazı insanlar güneş görmez karanlıkta yaşarlar, 
Bazı insanlar toprak görmez bulutlarda yaşarlar.

Sadakat

Yok şu cihanda bir büyük meziyet sâdakat gibi,
Anlam içinde gayb bulup nesneden ayrılmak gibi.

Sunday, January 17, 2016

SOAP (Simple Object Access Protocol)

SOAP, web servisler tarafından kullanılan standart mesajlaşma protokolüdür. Dağıtık uygulamaların birbiriyle kolay iletişime geçebilmesi için tasarlanmıştır. SOAP bir standart olup yazılım dillerine bağımlı değildir. SOAP iletişimde fazladan yeni bir teknolojiye ihtiyaç duymaz, bunun yerine var olan internet teknolojileri üzerinde çalışır. SOAP mevcut internet altyapısında olan router, firewall ve proxy sunucularda herhangi bir değişiklik yapmadan kolayca çalışmaktadır. SOAP genellikle web kaynaklarına ulaşmak için web tarayıcılar tarafından kullanılan HTTP üzerinden iletilir. Bir SOAP mesajının genel yapısı aşağıda verildiği gibidir.

<SOAP-ENV:Envelope xmlns:SOAPENV=" http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Header>
</SOAP-ENV:Header>
 <SOAP-ENV:Body>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

SOAP,  Header (başlık) ve Body (gövde) olarak adlandırılan iki ana bölümden oluşur. Bu iki kısım Envelope (zarf) adı verilen eleman içerisinde bulunmaktadır.

İstemci SOAP uygulaması bir SOAP istek mesajı oluşturarak bu isteği SOAP sunucusunda tanımlanmış servis uç noktalarından (end point) birisi tarafından çalıştırılması için gönderir. SOAP sunucu ilgili servisi çalıştırdıktan sonra SOAP yanıt mesajı hazırlar. Hazırlanan SOAP yanıt mesajı istemciye iletilir. SOAP mesajı HTTP paketi olarak iletilir. SOAP gövdesi çağırılacak metot ve metodun içerdiği parametreleri içerir. SOAP gövdesi içinde kodlanarak gönderilen bu mesaj, web servisi tarafından çözülür ve gerekli parametreler ve metot çağırım bilgilerine göre işlemlerini gerçekleştirdikten sonra, istemciye döndüreceği cevap bilgileri için, yine SOAP protokolüne uygun XML mesajlarını oluşturur. Bu mesajlar HTTP üzerinden istemci uygulamaya ulaşır, burada çözülür ve değerlendirilir. HTTP protokolünü desteklediğinden ve standart bir mesaj yapısı içerdiğinden, SOAP sayesinde web servisine platformdan bağımsız olarak çalışabilmektedir. Örneğin .NET platformunda hazırlanmış bir web servise JAVA ile erişilebilmektedir. Ayrıca HTTP standardı kullanıldığı iletişim işletim sistemlerine de bağımlı değildir. SOAP mesajlarının nasıl işlediği Şekil 1’de gösterilmiştir.

Şekil 1. SOAP mesajlarının gösterimi [1]

SOAP mesajı oluşturulurken RPC (Remote Procedure Call) veya “document” formatında oluşturulabilmektedir. Buradaki “encoded” ve “literal” deyimleri WSDL’den SOAP’a haritalamanın nasıl yapılacağını belirtmektedir. SOAP mesajlarının formatları aşağıda açıklanmıştır:


  • RPC/encoded: Örnek WSDL kodu aşağıda verilmiştir. 

<message name="myMethodRequest">
<part name="x" type="xsd:int"/>
<part name="y" type="xsd:float"/>
</message> <message name="empty"/>
 <portType name="PT">
<operation name="myMethod">
<input message="myMethodRequest"/>
<output message="empty"/>
</operation>
</portType>

Bu WSDL kullanılarak elde edilen SOAP mesajı aşağıdaki gibidir.

<soap:envelope>
<soap:body>
 <myMethod>
<x xsi:type="xsd:int">5
</x>
<y xsi:type="xsd:float">5.0
</y>
</myMethod>
</soap:body>
</soap:envelope>

Bu mesaj formatının WSDL kodu olabildiğince basit olmaktadır. Operasyon adı mesajda yer aldığı için bu mesajın karışıklığı yer vermeden kolayca çözülmesi mümkündür. Kodlama bilgisi olan “xsd:int” gibi yapılar performansı düşürmektedir. Mesaj içindeki x ve y’yi tanımlayan yapılar şema içinde tanımlanmış özellikleri kullanırken soap:body WSDL içinde yer alan bazı tanımlamalar içermektedir. Bu yüzden mesajın geçerlemesi zorlaşmaktadır.

  • RPC/literal: Örnek WSDL kodu aşağıda verilmiştir. 
<message name="myMethodRequest"> 
<part name="x" type="xsd:int"/> 
<part name="y" type="xsd:float"/> 
</message> <message name="empty"/>
 <portType name="PT"> 
<operation name="myMethod"> 
<input message="myMethodRequest"/> 
<output message="empty"/>
 </operation>
 </portType> 

Bu WSDL kullanılarak elde edilen SOAP mesajı aşağıdaki gibidir. 

<soap:envelope> 
<soap:body> 
<myMethod> 
<x>5</x> 
<y>5.0</y> 
</myMethod> 
</soap:body> 
</soap:envelope> 

Bu mesaj formatında da WSDL olabildiğince basittir. Operasyon adının mesajda yer alması karmaşıklığı önlemektedir. Mesajdan tip açıklaması kaldırılmıştır.

  • Document/literal: Diğer tiplere göre WSDL kodunda bazı değişiklikler içermektedir. 
<types> 
<schema>
 <element name="xElement" type="xsd:int"/>
 <element name="yElement" type="xsd:float"/> 
</schema> 
</types> 
<message name="myMethodRequest"> 
<part name="x" element="xElement"/> 
<part name="y" element="yElement"/> 
</message> <message name="empty"/>
 <portType name="PT"> 
<operation name="myMethod"> 
<input message="myMethodRequest"/>
 <output message="empty"/>
 </operation> 
</portType> 

Bu WSDL koduna ait SOAP mesajı aşağıda verilmiştir.

<soap:envelope> 
<soap:body> 
<xElement>5</xElement> 
<yElement>5.0</yElement>
 </soap:body> 
</soap:envelope>

Bu mesajlaşma tipinin en önemli özelliği SOAP içindeki bütün tanımlamalar şemada belirtildiği için geçerleme yapılması kolaydır. En büyük dezavantajı ise operasyon adının mesajda yer almamasıdır. 

  • Document/literal wrapped:  Bir önceki formatın eksikliklerini gidermek için WSDL kodunda daha fazla ayrıntı içerir. 
<schema> 
<element name="myMethod"> 
<complexType> <sequence> 
<element name="x" type="xsd:int"/>
 <element name="y" type="xsd:float"/> 
</sequence>
 </complexType>
 </element>
 <element name="myMethodResponse"> 
<complexType/> 
</element> 
</schema>
 </types> 
<message name="myMethodRequest">
 <part name="parameters" element="myMethod"/> 
</message> 
<message name="empty"> 
<part name="parameters" element="myMethodResponse"/>
 </message> 
<portType name="PT">
 <operation name="myMethod">
 <input message="myMethodRequest"/> 
<output message="empty"/>
 </operation> 
</portType>   

Bu WSDL koduna ait SOAP mesajı aşağıda verilmiştir. 

<soap:envelope> 
<soap:body> 
<myMethod> 
<x>5</x> 
<y>5.0</y>
 </myMethod>
 </soap:body> 
</soap:envelope>

Bu mesaj formatı RPC/literal ile bire bir benzeyen SOAP mesajları üretse de soap:body için çocuk elementi RPC/literal’de operasyon adına denk gelirken burada ise mesaj içeriğinin element adına denk gelmektedir. 


[1] Erl T., “Service-Oriented Architecture”, Prentice Hall, (2004).

WSDL Version 2.0 (WSDL 2.0 Versiyonu)

WSDL 2.0 eski WSDL 1.1 göre aşağıda belirtilen değişiklikleri içerir [1].

  • Mesaj yapıları kaldırılmıştır. 
  • Operatör üstüne yazma desteklenmemektedir. 
  • Port tiplerinin (PortTypes) isimleri ara yüzler ile (interfaces) değiştirilmiştir.
  • Portlar son nokta (endpoint) olarak yeniden isimlendirilmiştir.
  • Bazı ek tanımlama özellikleri eklenmiştir. 
WSDL 1.1 ile WSDL 2.0 arasındaki temel farklar aşağıda verilmiştir.




[1] İnternet: “http://www.xml.com/pub/a/ws/2004/05/19/wsdl2.html”, (2016).

WSDL (Web Services Description Language)

WSDL dokümanları, web servislerin nasıl tanımladığı bilgisini içeren XML dokümanlarıdır. 2007 yılından itibaren W3C tarafından tavsiye edilmektedir. Bir WSDL dokümanı aşağıdaki tablodaki etiketleri kullanarak web servisleri tanımlarlar.



Bir WSDL dokümanı genel olarak aşağıda verilen kod bloğu tarafından tanımlanır.
<definitions>
<types>   Veri tipleri  </types>
<message>   Mesajlar </message>
<portType>   Operasyonlar </portType>
<binding>   Protokol veri veri formatı tanımlamaları </binding>
</definitions>

Port types (Port tipleri) 

Port tipleri operasyonların ve ilgili mesajların tanımlandığı kısımdır. Aşağıda tanımlanabilecek operasyon tipleri verilmiştir.



Çift yönlü operasyona örnek olarak aşağıdaki kod bloğu gösterilebilir.

<wsdl:message name="HizmetCetvelInsertRequest">
<wsdl:part element="impl:HizmetCetvelInsert" name="parameters">
</wsdl:part> </wsdl:message>
<wsdl:portType name="Hitap4cWEBBean" >
<wsdl:operation name="HizmetCetvelInsert">
<wsdl:input message="impl:HizmetCetvelInsertRequest" name="HizmetCetvelInsertRequest"> </wsdl:input>
<wsdl:output message="impl:HizmetCetvelInsertResponse" name="HizmetCetvelInsertResponse"> </wsdl:output>
</wsdl:operation>
</portType >

Kod bloğunda “HizmetCetvelInsertRequest” mesajı şema içerisinde tanımlanmış “HizmetCetvelInsert” elementinden oluşan bir mesajdır. “HizmetCetvelInsert” operasyonu “HizmetCetvelInsertRequest” ve “HizmetCetvelInsertResponse” mesajları ile işlem yapan bir fonksiyonu tanımlamaktadır.   Servislerde en çok kullanılan yapı istek-cevap yapısıdır. Yukarıda verilen örnek bu durumuma uygundur.

Binding (Bağlayıcı)  

Protokol ve mesaj formatlarının detaylı olarak tanımlandığı kısımdır. Web servisin SOAP (Simple Object Access Protocol) ile ilişkisi burada tanımlanmaktadır. Örnek olarak aşağıdaki kod bloğu verilmiştir.

<wsdl:binding name="Hitap4cWEBBeanSoapBinding" type="impl:Hitap4cWEBBean"> <wsaw:UsingAddressing wsdl:required="false"/>
 <wsdlsoap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name="HizmetCetvelInsert">
 <wsdlsoap:operation soapAction="HizmetCetvelInsert"/>
<wsdl:input name="HizmetCetvelInsertRequest">
 <wsdlsoap:body use="literal"/>
</wsdl:input>
 <wsdl:output name="HizmetCetvelInsertResponse">
 <wsdlsoap:body use="literal"/>
 </wsdl:output>
</wsdl:operation>
 </wsdl:binding>

“Binding” elementi “name” ve “type” olmak üzere iki özelliğe sahiptir. “name” özelliği bağlamanın adını tanımlarken “type” özelliği portu belirtir. “soap:binding” elementi “style” ve “transport” olmak üzere iki özelliğe sahiptir. “style” özelliği “rpc” ve “document” değerlerini alabilmektedir. “transport” özelliği SOAP protokolünü tanımlamaktadır. Örnekte HTTP kullanılmıştır. SOAP mesajının nasıl kodlanacağını belirtmek için “literal” kullanılmıştır.

WSDL ve UDDI (Universal Description Discovery and Integration) 

OASIS (Yapılandırılmış Bilgi Standartları Örgütü) tarafından desteklenen bir girişim olan UDDI, kurumların sağladıkları servisleri yayınlamasını, bu bilgilerin daha sonra diğer kurumlarca taranıp bulunmasını, servislerin ve yazılım uygulamalarının internet üzerinde nasıl iletişimde olduğunu tanımlamasını sağlayan bir standarttır. UDDI üzerindeki servis kayıtları, güncellemeleri ve tarama işlemleri SOAP mesajları kullanılarak gerçekleştirilir.


XSD (XML Schema Definition) 1

XML veri için belirli bir format sunmasına rağmen bu formatın nasıl olacağını belirleyemediği için, bu tek başına yeterli değildir. Bunun yanında XML formatının oluşturulma kurallarını içeren ayrı bir ön bilgiye ihtiyaç duyulmaktadır. Bu amaçla W3C tarafından XSD kullanılması önerilmektedir. Örnek bir XSD aşağıda verilmiştir.

<xs:schema id="Kisi"     targetNamespace="http://tempuri.org/Kisi.xsd"     elementFormDefault="qualified"     xmlns="http://tempuri.org/Kisi.xsd"     xmlns:mstns="http://tempuri.org/Kisi.xsd"     xmlns:xs="http://www.w3.org/2001/XMLSchema" > <xs:element name="Kisi">  
<xs:complexType>
<xs:sequence>      
<xs:element name="Adi" type="xs:string" />      
<xs:element name="Soyadi" type="xs:string" />      
<xs:element name="Adresi" type="xs:string" />      
<xs:element name="TcKimlikNo" type="xs:double" />      
 <xs:element name="MedeniDurumu" minOccurs="0">        
 <xs:simpleType>          
 <xs:restriction base="xs:string">            
<xs:enumeration value="Bekar" />          
  <xs:enumeration value="Evli" />          
</xs:restriction>        
</xs:simpleType>      
</xs:element>  
  </xs:sequence>  
</xs:complexType>
</xs:element>
</xs:schema>

Bu XSD bilgisi ile tanımlanan veri yapısı Şekil 1'de verilmiştir. Örnekteki XSD ad, soyad, adres ve medeni durum bilgilerinin “string” tipinde olacağını belirtmektedir. T.C. kimlik numarası “double” tipinde olmalıdır. Ayrıca medeni durum bilgisi “Bekar” veya “Evli” değerlerinden birini almalıdır.

Şekil 1. XSD ile tanımlanan veri formatı

Örnek XSD’ye uygun veri aşağıdaki gibi tanımlanmalıdır. Eğer bir XML dokümanı XSD’ye uymuyorsa geçerli olmaz.

<?xml version="1.0" encoding="utf-8" ?>
<Kisi xmlns="http://tempuri.org/Kisi.xsd">
<Ad>Veli Yigit</Ad>
<Soyad>Yolcu</Soyad>
<Adres>Örnek adres</Adres>
<TcKimlikNo>11111111111</TcKimlikNo>
 <MedeniDurum>Bekar</MedeniDurum>  
 </Kisi>


Servis Yönelimli Mimari - SOA (Service Oriented Architecture)

SOA (Service Oriented Architecture), birçok uygulamanın kendi modülleri veya fonksiyonlarını başka uygulamalar tarafından kullanılacak şekilde tasarlandığı bir mimaridir. SOA, birbirinden bağımsız servisler aracılığı ile iş mantığının kurgulanmasını sağlar. İş modellerinin hızlı bir şekilde değişmesinden dolayı servis yönelimli mimari daha etkin olarak uygulanabilmektedir. SOA’da servislerin keşfedilebilir olması, kendi tanımlanabilmesi, birlikte çalışabilirliği, düşük bağımlılığı ve birleştirilebilir özelliklerde olması,  teknolojinin daha kolay kullanılabilmesine olanak tanır ve radikal değişimler işin bir potansiyel oluşturur. Servis tabanlı bir sistemin mantıksal gösterimi Şekil 1’de verilmiştir. Şekilde birbirinden bağımsız A ve B uygulamaları bir entegrasyon katmanı aracılığıyla etkileşmektedir.

Şekil 1.  Servis tabanlı mimariye sahip bir sistemin mantıksal gösterimi [1]

[1] Erl T., “Service-Oriented Architecture”, Prentice Hall, (2004). 

ASP.NET Nedir?

Microsoft, ASP.NET’in geliştirilmesine 1990 yılının sonlarında müşterilerinin Visual Basic kullanarak Windows uygulamaları yazmaya başladığı bir zamanda başladı. Microsoft ASP.NET’i Visual Basic programlama yapısını, sürekle bırak kontrollerini, olayları ve tasarım yapılarını koruyarak geliştiricilerin direk olarak HTML (Hypertext Markup Language) ve HTTP (Hypertext Transport Protocol) yapılarını bilmeden yazılım geliştirebilmeleri için oluşturdu. ASP.NET sayfa oluşturma (Page Rendering), sayfa kontrolleri (Page Controls), oturum yönetimi, görüntü durumu (View State) ve cevap saklama gibi özellikleri içeren bir yazılım platformudur[1]

Şekil 1. ASP.NET Genel Yapısı [1]
ASP.NET değişik ihtiyaçlara göre geliştirilmesiyle ve platforma yeni konseptlerin eklenmesiyle MVC (Model View Controller) ve Web API gibi yeni konseptler ortaya çıkmıştır.
ASP.NET bir web platformu olduğu için tarayıcı (browser) üzerine yüklenen formlar tanımlanmıştır. Formlar ASP.NET’te bilgi alışverişinde kullanılan yapılardır. ASP.NET çalışma prensibi kısaca şöyledir: Tarayıcılar ASP.NET kurulu bir sunucuya bir web sayfası için istekte bulunur. ASP.NET isteği algılayarak ilgili sayfayı oluşturup tarayıcıya geri gönderir. İlgili sayfa bir arka plan kodu tarafından işlenir ve genellikle kalıcı bir veri tabanına erişim yapar. Bu durum Şekil 2’de gösterilmiştir.

Şekil 2. ASP.NET çalışma prensibi [1]

ASP.NET web formları kullanmanın diğer bütün teknolojiler gibi bazı avantajları ve dezavantajları vardır. Avantajları şunlardır:


  • Web formları hızlı ve basit bir geliştirme ortamı sunmaktadır. Büyük yazılım uygulamaları az bir tecrübe ile hızlı bir şekilde oluşturulabilmektedir. 
  • Web formları alanında uzmanlaşmış kişi sayısı fazladır. MVC platformuna doğru sektörde kayma olsa da Microsoft tarafından yayınlanan bir makalede ASP.NET ile yapılan yazılımların %90’nın web formları olarak tasarlandığını göstermiştir.
  • Web formları hala aktif olarak kullanılmakta ve Microsoft tarafından yeni özellikler eklenerek geliştirilmektedir.
Web formlarının dezavantajları ise şöyle sıralanabilir:

  • Web formları hızlı geliştirme ortamı sunmasına rağmen geliştirilen yazılımların bakımı zordur. Geliştirilen yazılım çok ağır ve derin kodlara sahip olabilmektedir. Ayrıca bu ortamda yazılım geliştirilirken platformdan kaynaklanan problemler karşılaşma ihtimali yüksektir. 
  •  Web formları yetersiz bir kavram ayrışımına sahip olduğu için modül testleri zordur. 
  • Ağır görüntü durumu verileri ile web formu uygulamaları geniş bant genişliği kullanmaktadır.
[1] Freeman A. MacDonald M., Szpuszta M., “Pro ASP.NET 4.5 in C#”, Appress, (2013).  

Genişletilebilir İşaretleme Dili (XML) - Extensible Markup Language (XML)

Extensible Markup Language (XML) sistemler arasında ortak bir veri iletişimi protokolüne alt yapı oluşturmak amacıyla geliştirilmiş bir işaretleme dilidir. XML bilginin düzgün bir biçimde saklanması nı da sağlar. XML, içinde formatlı verinin hangi kısımlarının neyi ifade ettiğine ilişkin bilgileri saklar. XML, bilginin hangi şekilde tanımlandığına ilişkin işaretlemeleri içerirken HTML (Hyper Text Markup Language) bilginin nasıl görüntüleneceği konusundaki işaretlemeleri içerir. XML içinde yer alan bilgi ağaç yapısı oluşturmaktadır. Dolayısıyla XPATH gibi bazı araçlar kullanılarak elementler üzerinde arama yapılabilmektedir.

Bir XML dökümanı içindeki her şey "node" veya "element" olarak ifade edilir. Örnek olarak bütün aile bilgileri "Family" nodunun altında yer almaktadır. Ek olarak "Parents" ve "Children" nodları da "Family" nodu altında yer alan  alt nodelardır.

Bir XML dosyası bir kök (root) elementten, diğer element ve nitelik(attibute)' lerden oluşur. Örnek olarak bir aileyi XML formatında aşağıdaki gibi tanımlayabiliriz:

<?xml version="1.0" encoding="utf-8" ?>
<Family>
  <Parents>
    <Person ptype="Mother" gender="Female">
      <Ad>Aysun</Ad>
    </Person>
    <Person ptype="Father" gender="Male">
      <Ad>Veli</Ad>
    </Person>
    <Person ptype="GrandFather" gender="Male">
      <Ad>Ahmet</Ad>
    </Person>
  </Parents>
  <Children>
    <Person ptype="Child" gender="Male">
      <Ad>Yiğit</Ad>
    </Person>
  </Children>
</Family>

Örnek XML incelendiğinde XML içinde yer alan kişilerden kimlerin ebeveny oldukları, kimlerin çocuk oldukları açıkca belli olmaktadır. Ayrıca kişilerin cinsiyetleri nitelik olarak tanımlanmıştır. Nitelik kullanımı programlamayla ilgili bir durum olup etiket kullanılarak da aynı bilgi ifade edilebilirdi. 

Blogspot (Blogger) Robot.txt ve Özel Robot Etiket Ayarları - Blogspot (Blogger) Robot.txt and Special Robot Label Configuration

Arama motorlarının blog sitenizi daha içi algılayabilmesi için yani Search Engine Optimization (SEO) için blogger Robot.txt dosyasının ve özel robot etiket ayarlarının değiştirilmesine olanak vermektedir. Blogger sitenizden Şekil 1'de gösterildiği gibi Ayarlar > Arama tercihleri kısmını kullanarak ilgili ayarların bulunduğu yeri açınız.

Şekil 1. Blogger Arama Tercihleri
Daha sonra  Robot.txt ayarlarının yapabilmek için etkinleştiri veya düzenleyi seçiniz. Şekil 2'de görüldüğü gibi ilgili yazı alanına aşağıdaki kodları yapıştırıp kaydediniz. BlogName kısmına kendi blog adınızı yazınız. Sitemap yerine kırmızı olanı da kullanabilirsiniz.

Disallow:
User-agent: *
Disallow: /search
Allow: /
Sitemap: http://BlogName.blogspot.com/sitemap.xml
Sitemap:http://BlogName.blogspot.com/feeds/posts/default?orderby=updated
Sitemap:http://BlogName.blogspot.com.tr/atom.xml?redirect=false&start-index=1&max-results=500

Şekil 2. Robot.txt Ayarları
Son olarak özel robot etiket ayarları kısmını etkinleştir veya düzenle deyip ilgili kısımları Şekil 3'de görüldüğü gibi seçip kaydediniz. Burada yaptığımız ayarlara göre anasayfa, diğer sayfalar ve yayınlar tamamen indexlenecektir. DMOZ dizinine kayıt olmuş sitelerin, dizine kayıt olurken kullandıkları açıklamaların arama sonuçlarında gözükmemesi isteniyorsa "noodp" seçeneği seçilir.

Şekil 3. Özel Robot Etiket Ayarları


Robot.txt Ayarları - Robot.txt Configuration

Robot.txt dosyası burada da anlatıldığı gibi içeriklere ulaşılıp ulaşılmayacağının tanımlandığı text dosyasıdır. Genellikle google robotlarının veya tarayıcısının gereksiz tarama yaparak site bütçenize zarar vermesini veya sitenizi gereksiz yere meşgul etmesini engellemek için kullanılır. İçeriği aşağıdaki ögelerden oluşmaktadır:


User-agent: [Kuralları uygulayacak robotun adı]
Disallow: [Bloklanmak istenen URL yolu]
Allow: [Bloklu bir URL yolu içindeki yer alan ve bloklanması istenmeyen alt URL yolu]
Eğer kuralların tüm robotlar için geçerli olması isteniyorsa User-agent: * kullanılır.

Engelleme tanımlarının örnek kullanımları şu şekildedir [1]:

Engelle...

Örnek

Sitenin tamamı; düz eğik çizgi ile (/):
Disallow: /
Bir dizin ve içeriği; dizin adından sonra düz eğik çizgi ekleyerek:
Disallow: /sample-directory/
Bir web sayfası; eğik çizgiden sonra sayfayı listeleyerek:
Disallow: /private_file.html

[1] İnternet, "https://support.google.com/webmasters/answer/6062596?hl=tr&ref_topic=6061961", 2016

Friday, January 15, 2016

Metot İptal Etme (Overriding) vs Metot Gizleme - Method Overriding vs Method Hiding

Metot iptal etme veya üzerinde yazma kalıtım bırakmada bir metodun daha gelişmiş özelliklerle genişletilmesi gerektiğinde kullanılır. Metot gizleme ise iptal etmeye müsait olmayan bir metot türetilen sınıfta aynı isimde tanımlandığında devreye girer. "new" anahtar kelimesi kullanılarak gizleme yapıldığına kesinlik kazandırılabilir. Gizleme yapıldığı konusunda kesinlik kazandırılmaz ise gizleme geçerlidir fakat derleyici tarafından uyarı yapılır. Aşağıdaki Class2 sınıfı Class1 sınıfından türemiştir. "getName" metodu türetilen sınıfta iptal edilmiştir.

public class Class1
    {
        public Class1() { }

        public virtual void getName()
        {
            Console.WriteLine("Class1");
        }

    }

    public class Class2 : Class1
    {
        public Class2() { }

        public override void getName()
        {
            Console.WriteLine("Class2");
        }
    }

Bu sınıflar aşağıdaki kod ile çağrıldığında şu sonuçlar elde edilmiştir:

Class1
Class2
Class2
 
    class Program
    {
        static void Main(string[] args)
        {
            Class1 c1 = new Class1();
            c1.getName();

            Class1 c2 = new Class2();
            c2.getName();

            Class2 c3 = new Class2();
            c3.getName();

            Console.ReadLine();
        }
    }

Görüldüğü üzere ilk c1 nesnesi hafıza alanında Class1 sınıfı referans alınarak oluşturulduğu için iptal etme işlemi uygulanması. Fakat diğer ikisinde Class2 nesnesi referans alınarak oluşturulduğu için iptal etme işlemi geçerli oldu.

Bazı durumlarda, özellikle de ebeveyn sınıfının eski versiyonunun kaybedilmesinin istenmediği durumlarda gizleme kullanılabilir.

public class Class1
    {
        public Class1() { }

        public void getName()
        {
            Console.WriteLine("Class1");
        }

    }

    public class Class2 : Class1
    {
        public Class2() { }

        public new void getName()
        {
            Console.WriteLine("Class2");
        }
    }

Main metodu tekrar çalıştırıldığında aşağıdaki sonuçlar elde edilir:

Class1
Class1
Class2

Sonuçtan da anlaşılabileceği gibi iptal etme işlemi artık geçerli olmadığı için c2 nesnesi üzerinde Class1 tipindeki referans değişkeni üzerinden erişim yapıldığında Class1 üzerindeki fonksiyon kullanılmıştır.






Wednesday, January 13, 2016

Sealed (Mühürlü) Başvurusu - Sealed Keyword

Sealed başvurusu isminden de anlaşılabileceği bir ögenin mühürlendiğini yani herhangi bir değişikliğe maruz kalamayacağını belirtir. Sealed kullanılan sınıftan başka bir sınıf türetilemez veya sealed kullanılan virtual (sanal) bir metot override (üstüne yazma) edilemez. Örnek kullanımı şöyledir:

public sealed class A {}

C# Erişim Belirliyecileri - C# Access Modifiers

Nesne yönelimli programlama (NYP)'de öz-kapsülleme (encapsulation) yapılabilmesini sağlayan araçlardır. Bu araçlar kullanılarak duruma göre ögeler gizlenebilir veya dışarı sunulabilir. Erişim belirliyecileri şunlardır:

1. Public: Ögenin erişimine herhangi bir kısıt getirilmeyeceği zaman kullanılır.

2. Private: Ögeye dışardan erişimin engelleneyeceği zaman kullanılır. C#'da eğer öge hakkında bir erişim değiştiricisi tanımlanmazsa default olarak öğenin erişim değiştiricisi private kabul edilir.

3. Protected: Ögenin erişiminin aynı sınıf içindeki diğer ögelere ve ögenin içinde bulunduğu sınıftan türeyen diğer sınıf ögelerine açık olması gerektiği zaman kullanılır.

4. Internal: Ögenin erişiminin sadece aynı Assembly içinde bulunduğu diğer ögelere açık olması gerektiğinde kullanılır.

Örnek kullanımları şunlardır:

public int variable1;
private double variable2;
protected string variable3;


Monday, January 11, 2016

ASP.NET Uygulamalarından Elektronik Posta Göndermek - Sending E-Mail from ASP.NET Applications

Müşteri ihtiyaçlarına göre bazı durumlarda uygulamadan e-posta gönderilmesi gerekebilmektedir.Bu durumda .NET üzerinde tanımlı "System.Net.Mail" ad alanı içindeki "SmtpClient" sınıfı kullanılarak e-posta gönderilebilmektedir. Örnek olarak aşağıdaki kod bloğu verilebilir:

MailMessage mail = new MailMessage(pfrom, pto);
mail.IsBodyHtml = IsHtmlBody;

mail.DeliveryNotificationOptions = DeliveryNotificationOptions.OnFailure;

SmtpClient client = new SmtpClient();
client.Credentials = new NetworkCredential(UserName, Password);
client.Port = Port;
client.DeliveryMethod = SmtpDeliveryMethod.Network;
client.UseDefaultCredentials = false;
client.Host = Host;
mail.Subject = psubject;
mail.Body = pmessage;
client.Send(mail);

Eğer e-posta bir HTML mesajı içeriyorsa MailMessage nesnesinin IsBodyHtml özelliği "true" yapılmalıdır.

Bunun dışında bazen eski e-posta sunucuları kullanılarak e-posta gönderilirken yukarıda kullanılan "System.Net.Mail" ad alanını içindeki sınıf sıkıntı çıkarabilmektedir. Bu durumda "System.Web.Mail" içinde yer alan SmtpMail sınıfı kullanılarak e-posta gönderim işlemi yapılabilmektedir. Aşağıda bu durum için örnek kod bloğu verilmiştir:

MailMessage mail = new MailMessage();
mail.To = pto;
mail.From = pfrom;
mail.Subject = psubject;
mail.Body = pmessage;

mail.Subject = psubject;
mail.Body = pmessage;

SetMailConfiguration(mail);

SmtpMail.Send(mail); 

Bu yöntem kullanıldığında doğrulama (Authentication) bilgisi aşağıdaki şekilde eklenmelidir:

mail.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate", "1"); //basic authentication
mail.Fields.Add("http://schemas.microsoft.com/cdo/configuration/sendusername", UserName); //set your username here
mail.Fields.Add("http://schemas.microsoft.com/cdo/configuration/sendpassword", Password); //set your password here

Eğer mesaj HTML içeriyorsa ayarlamalara aşağıdaki kod eklenmelidir:

mail.BodyFormat = MailFormat.Html;


ASP.NET Oracle Managed Provider Kurulumu ve Ayarlanması - ASP.NET Oracle Managed Driver Configuration

Managed provider oracle tarafından yayınlanmış ve tamamen "Managed" kod ile yazılmış bir sağlayıcıdır. Managed sağlayıcı ile artık sunuculara "Oracle Client" kurma zorunluluğu kalkmıştır. ASP.NET web application projesi üzerinde "Referances" klasörü üzerine sağ tıklanıp Nuget üzerinden "Oracle Managed Provider" yüklendikten sonra webconfig dosyası içinde aşağıdaki ayarlamalar yapılmalıdır. Aşağıdaki XML kodları sadece bu yazının içinde kullanılan provider versiyonu için geçerli olup, diğer versiyonları için geçerli kodları provider kurulum dosyasında bulabilirsiniz. Bu dosya son denememde nuget paketi ile gelmekteydi. Yani paket dosya yoluna gittiğinizde bu kurulum dosyasını bulabilmeniz gerekir.

<configuration><configSections> içine aşağıdaki section bilgisi eklenmelidir. Bu bilgi webconfig içindeki "oracle.manageddataaccess.client" ayarlarının okunabilmesini sağlayacaktır.

<section name="oracle.manageddataaccess.client" type="OracleInternal.Common.ODPMSectionHandler, Oracle.ManagedDataAccess, Version=4.121.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />


<configuration><connectionStrings> içine bağlantı cümlesi tanımlanmalıdır:

<add name="Context" connectionString="DATA SOURCE=MYDATASOURCE;PASSWORD=MAYPASSWORD;USER ID=MYUSERID" providerName="Oracle.ManagedDataAccess.Client" />


<configuration>  içine aşağıdaki kod eklenerek varsa diğer sağlayıcılar iptal edilmelidir.

<system.data>
    <DbProviderFactories>
      <remove invariant="Oracle.DataAccess.Client" />
      <remove invariant="Oracle.ManagedDataAccess.Client" />
      <add name="ODP.NET, Managed Driver" invariant="Oracle.ManagedDataAccess.Client" description="Oracle Data Provider for .NET, Managed Driver" type="Oracle.ManagedDataAccess.Client.OracleClientFactory, Oracle.ManagedDataAccess, Version=4.121.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
    </DbProviderFactories>
  </system.data>

<configuration> içine aşağıdaki kod eklenerek daha önce TNS.ORA dosyası içinde yapılan network yönlendirmeleri tanımlanmalıdır. Protocol olarak TCP veya TCPs olarak uygun olanı seçiniz.

<oracle.manageddataaccess.client>
    <version number="*">
      <dataSources>
        <dataSource alias="MYDB" descriptor="(DESCRIPTION =(ADDRESS = (PROTOCOL = TCPS)(HOST = MYHOST)(PORT = 1521))(CONNECT_DATA = (SERVER = DEDICATED)(SERVICE_NAME = MYSERVICE)))"/>
        <dataSource alias="MYDB2" descriptor="(DESCRIPTION =(ADDRESS = (PROTOCOL = TCP)(HOST = MYHOST2)(PORT = 1521))(CONNECT_DATA = (SERVER = DEDICATED)(SERVICE_NAME = MYSERVICE2)))"/>
      </dataSources>
    </version>
  </oracle.manageddataaccess.client>



C# ile Nesnelerin XML Formatına Dönüştürülmesi - Transform of Objects into XML Coding

Nesneler veri tabanında saklanırken bazı durumlarda insanların anlayabileceği, hatta içerik sorgulayabileceği bir formata çevrilmesi gerekebilir. Bu durumumda "XmlSerializer" sınıfı kullanılarak nesneler XML formatına dönüştürülebilmektedir. Aşağıdaki örnekte "SerializeObjectXml" fonksiyonu kullanılarak nesne XML formatlı string değerine dönüştürülmektedir. "DeSeriliazeObjectXml" fonksiyonu kullanılarak da XML formatından geri dönüş yapılabilmektedir.

 public static string SerializeObjectXml(T Obj)
 {        
      StringWriter swriter = new StringWriter();
      XmlSerializer sxml = new XmlSerializer(typeof(T));
      sxml.Serialize(swriter, Obj);
      return swriter.ToString();
 }

 public static T DeSeriliazeObjectXml(string XmlString)
 {
      XmlSerializer sxml = new XmlSerializer(typeof(T));
      return (T)sxml.Deserialize(new StringReader(XmlString));
 }

C# ile Nesnelerin Serileştirilmesi - Object Serialization

Bazı durumlarda nesnelerin serileştirilip yanı byte dizisi (byte[]) haline getirilip veritabanında saklanması gerekebilmektedir. Bu durumda "BinaryFormatter" sınıfı kullanılarak nesneler serileştirilebilmektedir. Aşağıdaki örnekte "SerializeObjectBinary" fonksiyonu nesneyi serileştirmek için kullanılmakta ve "DeSerializeObjectBinary" fonksiyonu ile nesne tekrar elde edilebilmektedir.

public static byte[] SerializeObjectBinary(object Obj)
{
     MemoryStream stream = new MemoryStream();
     BinaryFormatter formatter = new BinaryFormatter();
     formatter.Serialize(stream, Obj);

     return stream.ToArray();
}

public static object DeSerializeObjectBinary(byte[] ObjBinary)
{
     MemoryStream stream = new MemoryStream();
     stream.Write(ObjBinary, 0, ObjBinary.Length);
     stream.Position = 0;
     BinaryFormatter formatter = new BinaryFormatter();
     return formatter.Deserialize(stream); ;
}


C# Jenerik Fonksiyonlar - C# Generic Functions

Jenerik fonksiyonlar kodlama içinde fonksiyonun tipe göre reaksiyon gösterebilmesini sağlamaktadır. Kavram olarak çok biçimlilik (polymorphism) konusunun örneklerindendir. Aşağıdaki örnek fonksiyonda iki sınıfın ortak "property" değerleri diğerine kopyalanmaktadır ve fonksiyon üzerine kopyalama yapılan nesneyi kendi tipinde döndürmektedir.

public static T CopyObject < T >(object From, T To) where T:class
{
     Type tfrom = From.GetType();
     Type tto = typeof(T);

     foreach (PropertyInfo to_property in tto.GetProperties())
     {
          foreach (PropertyInfo from_property in tfrom.GetProperties())
          {
              if (from_property.Name == to_property.Name)
              {
                  to_property.SetValue(To, from_property.GetValue(From));
                  break;
              }
          }
     }

     return To;          
}

Entity Framework 6 Veri Tabanı Fonksiyonu Haritalama (Önce Kod Örüntüsü) - Entity Framework 6 Database Function Mapping (Code First Pattern)

Entity Framework 6 (EF) ile beraber yeni genel "Conventions" özelliği ile artık "Code First" örüntüsü kullanarak EF meta bilgisine müdahele edilebilmektedir. Aşağıdaki örnekte Oracle içinde yer alan TO_CHAR ve TO_NUMBER fonksiyonları haritalanmıştır.

public class FunctionConvention : IStoreModelConvention
{
        public void Apply(EdmModel item, DbModel model)
        {
            AddToCharFunc(model);
            AddToNumberFunc(model);
        }

        public void AddToCharFunc(DbModel dbModel)
        {
            var edmType = PrimitiveType.GetEdmPrimitiveType(PrimitiveTypeKind.String);
            var payload =
                new EdmFunctionPayload
                {
                    Schema = "SYS.STANDARD",
                   
                    ParameterTypeSemantics = ParameterTypeSemantics.AllowImplicitConversion,
                    IsComposable = true,
                    IsNiladic = false,
                    IsBuiltIn = true,
                    IsAggregate = false,
                    IsFromProviderManifest = true,
                    StoreFunctionName = "TO_CHAR",
                    ReturnParameters =
                        new[]
                    {
                        FunctionParameter.Create("ReturnType", edmType, ParameterMode.ReturnValue)
                    },
                    Parameters =
                new[]
                {
                    FunctionParameter.Create("Val", PrimitiveType.GetEdmPrimitiveType(PrimitiveTypeKind.Int32), ParameterMode.In)
                }
                };

            var function = EdmFunction.Create("TO_CHAR", "EntityLayer.Utility", DataSpace.SSpace, payload, null);
            dbModel.StoreModel.AddItem(function);
        }

        public void AddToNumberFunc(DbModel dbModel)
        {
            var edmType = PrimitiveType.GetEdmPrimitiveType(PrimitiveTypeKind.Decimal);
            var payload =
                new EdmFunctionPayload
                {
                    Schema = "SYS.STANDARD",
                    ParameterTypeSemantics = ParameterTypeSemantics.AllowImplicitConversion,
                    IsComposable = true,
                    IsNiladic = false,
                    IsBuiltIn = true,
                    IsAggregate = false,
                    IsFromProviderManifest = true,
                    StoreFunctionName = "TO_NUMBER",
                    ReturnParameters =
                        new[]
                    {
                        FunctionParameter.Create("ReturnType", edmType, ParameterMode.ReturnValue)
                    },
                    Parameters =
                new[]
                {
                    FunctionParameter.Create("Val", PrimitiveType.GetEdmPrimitiveType(PrimitiveTypeKind.String), ParameterMode.In)
                }
                };

            var function = EdmFunction.Create("TO_NUMBER", "EntityLayer.Utility", DataSpace.SSpace, payload, null);
            dbModel.StoreModel.AddItem(function);
        }  
    }


FunctionConvention sınıfı ilgili fonksiyonların haritalanması için gerekli meta bilgilerin oluşturulmasını sağlayan bir Convention sınıf oluşturulduktan sonra Context sınıfı içinde yer alan "OnModelCreating" fonksiyonu içinde tanımlanmaktadır.

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
       modelBuilder.Conventions.Add(new FunctionConvention());
}


Yukarıdaki işlemler yapıldıktan sonra LINQ sorgularında kullanılabilmesi için aşağıdaki gibi bir sınıf içinde ilgili fonksiyonların karşılıkları tanımlanmalıdır:

public class CommonFunctions
{
     [DbFunction("EntityLayer.Utility", "TO_CHAR")]
     public static string TO_CHAR(int Val)
     {
         throw new NotSupportedException();

     }

     [DbFunction("EntityLayer.Utility", "TO_NUMBER")]
     public static decimal TO_NUMBER(string Val)
     {
         throw new NotSupportedException();
     }
}





ASP.NET Üzerinde Jquery ile AJAX İşlemleri - AJAX Processes with JQUERY on ASP.NET

ASP.NET'de ihtiyaç duyulabilecek en önemli şeylerden biri AJAX işlemleridir. AJAX işlemleri web sayfası üzerinden "postback" olmadan bilgi alışverişi yapılmasını sağlar. Jquery'nin ajax fonksiyonu ile aşağıdaki kod parçası kullanılarak sunucuda yer alan "FonksiyonAdi" fonksiyonuna  "KullaniciAdi" parametresi veya JSON nesnesi gönderilmekte ve kullanıcı soy ismi geri dönmektedir.

$.ajax({

       type: 'POST',
       url: './SayfaAdi.aspx/FonksiyonAdi',
       data: '{ KullaniciAdi:"Yigit" }',
       contentType: 'application/json; charset=utf-8',
       dataType: 'json',
       success: function (result) {

                 alert(result.d);
                     
                },
                error: function (e) {
                         
                  alert('Hata Oluştu');

                }
      });

Sunucu tarafında sayfanın kod kısmında yer alan kod parçacığı aşağıdaki gibidir.

[System.Web.Services.WebMethod]
public static string FonksiyonAdi(string KullaniciAdi)
{
    return "YOLCU";
}

Sunday, January 10, 2016

Interface (Arayüz) Nedir? Abstract (Soyut) Sınıf ile Arayüz Arasındaki Fark Nedir? - What is Interface? What is Difference between Interface and Abstract Class?

Konsept olarak ikisinin ifade ettiği kavramlar çok farklıdır. Arayüz herhangi bir nesnenin yapısı hakkında bilgi içermek yerine nesnenin nasıl kullanıldığıyla ilgilidir. Fakat Soyut sınıflar nesne yapısı hakkında bilgi içerirler ve nesnenin var oluşunda kavramsal etkiye sahiptirler. Soyut sınıflarla ilgili örnek daha önceki makalede verilmişti. Arayüz için aşağıdaki C# kodu örnek olarak verilebilir. Bu örnekte birbiriyle tür olarak hiç bir alakası olmayan iki sınıfın ekleme zamanı (Insert Time) ve güncelleme zamanı (Update Time) olarak iki kayıt özelliğini taşıdığını görüyoruz. Bu sınıflara ILog arayüzünü eklenerek ortak bir yöntem ile ortak özelliklere erişim imkanı vermiş olduk. Arayüzler sınıfların kalıtımından farklı olarak birden çok kere aynı sınıfta kullanılabilirler. Ayrıca arayüzler konsept gereği private (gizli) ögeler içeremezler.

public interface ILog
{
    DateTime InsertTime { get; set; }
    DateTime UpdateTime { get; set; }  
}

public class EmployeeDatabaseTable:ILog
{
    public string Name { get; set; }
    public string SurName { get; set; }

    public EmployeeDatabaseTable()
    { }

    public DateTime InsertTime { get; set; }

    public DateTime UpdateTime { get; set; }
}

public class CarXML:ILog
{
    public string Brand { get; set; }
    public string PlateNumber { get; set; }

    public CarXML()
    { }

    public DateTime InsertTime { get; set; }

    public DateTime UpdateTime { get; set; }
}



Abstract (Soyut) Sınıf Nedir? - What is Abstract Class?

Soyut sınıflar aslında var olmayan fakat konsept olarak bir kavramı ifade eden sınıflardır. Örneğin kedi ve köpek ortak olarak bir hayvan olmalarına rağmen hayvan dediğimiz şey bir kimlik kazanmadan var olamaz. Nesne yönelimli programlamada bu durumlarda soyut sınıflar kullanılır. Soyut sınıfların en önemli özelliği bu sınıflardan nesnelerin türetilememesidir. Normal sınıflardan bir diğer farkı ise sadece tanımlanmış fakat tamamlanmamış soyut ögeler içerebilmesidir. Bu ögeler bu sınıftan miras alan diğer sınıflarca tamamlanacaktır. Örnekle paralel olarak aşağıdaki C# kodlarını oluşturabiliriz.

public abstract class Animal
{
    public decimal Weight { get; set; }
    public decimal Volume { get; set; }

    public Animal(decimal Weight, decimal Volume)
    {
        this.Weight = Weight;
        this.Volume = Volume;
    }
     
    public abstract string GetSpecies();

}

public class Cat:Animal
{
    public Cat(decimal Weight, decimal Volume)
        : base(Weight, Volume){}
 
    public override string  GetSpecies()
    {
       return "Cat";
    }
}

public class Dog : Animal
{
    public Dog(decimal Weight, decimal Volume)
        :base(Weight, Volume){}

    public override string GetSpecies()
    {
       return "Dog";
    }
}

Nesne Yönelimli Programlama (NYP) Temel Kavramlar - Object Oriented Programming (OOP) Basic Consepts

NYP'nin en temel kavramları şunlardır:

1. Soyutlama (Abstraction): Soyutlama günlük hayatta hayatı yaşanabilir kılan en önemli olgulardan biridir. Kavram olarak karmaşıklığın gizlenmesini ifade eder. Bu kavramı anlatmak için en güzel örnek yine insanın kendisi olacaktır. Bilindiği üzere insan yaşamını sürdürmek için kan dolaşımını sağlamalı, düşünmeli, görmeli, anlamalı vb. bir çok fiziki ve mental işlemleri gerçekleştirmelidir. Bunların yapılabilmesi aslında birçok iç işleyişin, mantıksal hesaplamanın ve kurgunun sonucudur. Fakat insan bunların çoğundan direk olarak haberdar olmaz. Sürekli kalp atışını duymanın ne kadar çekilmez bir şey olacağı konusunda sanırım herkes hemfikir olacaktır.

2. Kapsülleme (Öz-Kapsülleme) (Encapsulation) : Kavram olarak soyutlamanın bir alt kümesidir. Bazı kaynaklarda bilgi saklama (Information Hiding) olarak da tanımlanmaktadır. Kelime olarak incelendiğinde "capsulation" (kapsülleme) ve iç içelik anlamı katan "en" eki ile oluşturulmuştur. Yani Türkçe'ye çevirirken "Öz-Kapsülleme" olarak çevrilmesi daha doğru olacaktır. NYP'de iç işleyişle alakalı olup dışarı sunulmasına gerek olmayan öğelerin gizlenmesi anlamında kullanılmaktadır. Yukarıdaki örnekle paralel bir örnek vermek gerekirse, insanların saydam olmamasının çok önemli bir şey olduğu konusunda da sanırım herkes hemfikir olacaktır.

3. Kalıtım (Inheritance): Eski programlama dillerinin en önemli dezavantajlarından biri yeniden kullanılabilirlik özelliklerinin düşük olmasıdır. Bu durum geliştirilen yazılımların bakım maliyetlerini büyük ölçüde artırmaktadır. Kalıtım kelime olarak ebeveyn öğenin özelliklerini çocuk öğelere iletmesi manasına gelmektedir. Klasik bir örnekle anlatmak gerekirse her memeli bir hayvandır. Burada her memelinin hayvan olarak tanımlanması genelleme (generalization) olarak isimlendirilmektedir. Bilindiği üzere her memeli yemek, içmek ve uyumak gibi ortak aktiviteleri ve özellikleri paylaşır.

4. Çok Biçimlilik (Polymorphism): Tek bir arayüz üzerinden değişik tipdeki öğelerin özelliklerinin kullanılabilmesini ifade eder. NYP'de ençok karşılaşılan çok biçimlilik örnekleri ebeveyn öğenin çocuk öğelerin yerine kullanılmasında veya arayüz (interface) kullanılmasında ortaya çıkar.