LinkedIn FriendFeed Twitter

IKVM.NET

by Ordinaryus 22. July 2010 00:34

IKVM.NET projesi java dosyalarının .NET ortamında dinamik olarak çağrılmasını amaçlayan bir uygulamadır.Bu uygulama içerisinde JVM içerisinde .NET uygulamaları geliştirilebildiği gibi hazırlanmış Java uygulamarının .NET içinde kullanılmasına da olanak vermektedir.

IKVM ile java kodunu çalıştırmak istediğimizde ise bunu Java uygulamasının bin dizini üzerinden yapmaktayız.

Burada yazılmış olan deneme Java uygulaması aşağıdaki gibidir.

1

Burada oluşturulan uygulamanın bin dizini altındaki dosyasının çalıştırılması ile uygulamanın çalıştığı doğrulanmaktadır.

2

Aynı zamanda çalıştırılan bir java uygulamasına ait *.jar paketini daha sonra .NET programı haline geririp *.exe uzantısı alması sağlanabilmektedir. Bunun için jar dosyasının dizininde çalıştırılması gereken program ikvmc olmaktadır.

3

Burada illaki jar dosyaları kullanılmak zorunda olmamaktadır. Bunun haricinde javaya ait .class dosyaları da kullanılmaktadır.Bunun için java projesinin bin dizini altında komut çalıştırılması gerekmektedir.

4

Bu işlemin tersini tabiki de yapmak mümkün olmaktadır. Bunun için verilen bir *.dll dosyası IKVM yardımıyla javada kullanılmak üzere bir *.jar dosyasına dönüştürülebilmektedir. Burada örnek teşkil etmesi açısından bir mscorlib.dll dosyasını kullandık.

5

Veya C#ta yazmış olduğumuz basit bir class library için kullanıldığında buradan gelen jar dosyası Java projelerine aktarılabilmektedir.

Kullanılan class library projesine ait kod Java Projesinde olduğu gibi basit bir uygulamadır. Buna ait yazılan metot ve konsol için çıktı üreten kod aşağıdaki gibidir.

6

Kütüphanelerimizi oluşturduk bunun yanında bunların kullanılmasını inceleyelim. HelloJava uygulaması içerisinde oluşan hello.class dosyasından hello.exe oluşturulmuştu.

Bunu referanslardan C# uygulamamıza eklemek mümkün olmaktadır. Bunun dışında eklenmesi gereken bir adet daha dll bulunmaktadır. IKVMye ait olan bu dll IKVM.OpenJDK.Core.dll adlı dosyadır. Bundan sonra hello sınıfındaki main metodu çalıştırılabilir.

7

8

Bu uygulama sonucunda öncelikli olarak C#ta yazılan Class Library çalışmakta daha sonra ise Javada yazılan uygulamanın C#a dönüştürülmesi sonucu oluşan .exe kullanılmaktadır.

9

http://www.ikvm.net adresinden daha fazla bilgi alınabilmektedir.

http://sourceforge.net/projects/ikvm/ adresinden ise proje indirilebilmektedir.

Tags:

C# Mouse Events

by Ordinaryus 8. January 2010 23:34

In C# programming using mouse events is a need for many programmer. Using C#, Mouse positions can be easily used but, we can’t change mouse position or create mouse click.

There is a solutions for this problem. We can use DllImport to access windows APIs, so we can both change mouse position and create click event.

I write a Mouse class because of this need. We can access mouse position, set cursor coordinates and create left and right click events.

    class Fare
    {
        [DllImport("user32.dll")]
        private static extern void mouse_event(UInt32 dwFlags, UInt32 dx, UInt32 dy, 
        UInt32 dwData, IntPtr dwExtraInfo);
        
        [DllImport("user32.dll")]
        static extern bool SetCursorPos(int x, int y);
        
        private const UInt32 MouseEventLeftDown = 0x0002;
        private const UInt32 MouseEventLeftUp = 0x0004;
        private const UInt32 MouseEventRightDown = 0x0008;
        private const UInt32 MouseEventRightUp = 0x0010;

        static public int konumX
        {
            get { return System.Windows.Forms.Control.MousePosition.X; }
        }

        static public int konumY
        {
            get { return System.Windows.Forms.Control.MousePosition.Y; }
        }


        public static void SendLeftClick()
        {
            mouse_event(MouseEventLeftDown, (uint)konumX, (uint)konumY, 0, new System.IntPtr());
            mouse_event(MouseEventLeftUp, (uint)konumX, (uint)konumY, 0, new System.IntPtr());
        }

        public static void SendRightClick()
        {
            mouse_event(MouseEventRightDown, (uint)konumX, (uint)konumY, 0, new System.IntPtr());
            mouse_event(MouseEventRightUp, (uint)konumX, (uint)konumY, 0, new System.IntPtr());
        }

        public static void SendMouseDown()
        {
            mouse_event(MouseEventLeftDown, (uint)konumX, (uint)konumY, 0, new System.IntPtr());
        }

        static public void SetFare(int x, int y)
        {
            SetCursorPos(x,y);
        }
    }

Tags: ,

.NET

VS içerisinde kendi Snippetlarımızı yaratmak

by Ordinaryus 28. July 2009 17:58

 

Visual Studio’da kod yazmak yazılımla uğraşan biri olarak fazlasıyla sevdiğim bir şeydi. Yazılımcının iş yükünü hafifleten çözümler üretmesi, tekrarlardan sakınılmasını sağlaması ve kullanım kolaylığı en önemli özelliklerinden. İntelli sense desteği olsun, snippetları olsun fazlasıyla avantajlıdır.

Yazılım geliştirirken diğer programlama dillerinde de kodun maliyetini azaltmak adına yapılmış uygulamalar bulunmaktadır burada kod tekrarını azaltarak yazılımcının verimliliğini arttırmak amaçlanmaktadır.

Güzel bir mimari kullanmak her zaman için yazılımcılar için önemlidir ancak bunun dışında sık tekrar edilen kodlar için C dilinde de bulunan inline functionlar ki bunların diğer fonksiyonlardan farkı herhangi bir dallanma olmaksızın fonksiyonun çağrıldığı yere kodun derleyici tarafından otomatik yazılmasıdır. Bu yöntem avantajlı olduğu söylenebilecek bir yoldur.

Visual Studioda kullanmakta olduğumuz Code Snippetlar ise bu olayı yazılımcı yönünden oldukça kolaylaştırıyor. Sık kullanılan yapılar için anahtar sözcüklerle kod oluşturuluyor ve zaman kazandırıyor.

VS ile bize kazandırılan bu avantajın kendimiz içinde sıklıkla kullandığımız yapıları Snippet halinde kullanmamızda mümkündür. Ben bu nedenle sıklıkla kullandığım kodları Snippet haline getirerek kullanmaktayım. Sizlerinde bu yönteme başvurmanızı öneririm. Mesela Singleton kalıbını muhakkak kullanmaktayız ancak bu yapıyı yazmak bir süre sonra zahmet verici bir iş olmakta. Bu nedenle Singleton için bir snippet oluşturarak snippetların nasıl yaratıldığını inceleyelim.

.. \Microsoft Visual Studio 9.0\VC#\Snippets\1033 dizini altında Snippetlara ulaşabiliriz. Burada .snippet uzantılı bir dosya oluşturalım veya var olan dosyalardan birini kopyalayarak bunun üzerinde oynamalar yapalım.

<?xml version="1.0" encoding="utf-8" ?>

<CodeSnippets  xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">

      <CodeSnippet Format="1.0.0">

            <Header>

                  <Title>Singleton</Title>

                  <Shortcut>singleton</Shortcut>

                  <Description>Singleton icin snippet</Description>

                  <Author>Ordinaryus</Author>

                  <SnippetTypes>

                        <SnippetType>Expansion</SnippetType>

                  </SnippetTypes>

            </Header>

            <Snippet>

                  <Declarations>

                        <Literal>

                             <ID>type</ID>

                             <ToolTip>Property type</ToolTip>

                             <Default>int</Default>

                        </Literal>

                        <Literal>

                             <ID>variable</ID>

                             <ToolTip>Variable name</ToolTip>

                             <Default>MyVariable</Default>

                        </Literal>

                        <Literal>

                             <ID>_variable</ID>

                             <ToolTip>variable name</ToolTip>

                             <Default>_MyVariable</Default>

                        </Literal>

                  </Declarations>

                  <Code Language="csharp"><![CDATA[private $type$ $_variable$;

                  public $type$ $variable$

                  {

                        get

                        {

                             if($_variable$== null)

                                   $_variable$= new $type$();

                                   return $_variable$;

                        }

                  }$end$]]>

                  </Code>

            </Snippet>

      </CodeSnippet>

</CodeSnippets>

 

Burada gördüğümüz XML yapısı içerisinde Snippetımız için gerekli olan bilgiler bulunmakta.

<Shortcut> içerisinde VS içerisinde hangi anahtar kelime yazılarak çağrıldığını göstermektedir. İntellisense desteği sayesinde bu Snippet anahtar kelimeside kolayca bulunmaktadır.

<Snippet> içerisindeki <Declarations> yapısının içerisinde değişkenlerimizi tanımlamaya başlamaktayız. <Literal> içinde değişkenlerimizin default değerlerine, snippet içersinde nasıl tanımlandığını görebiliriz.

 

<Code Language="csharp"> Burada yazmakta olduğumuz dili tanımlamakta ve içerisine üretilmesini isteyen kodu yazmaktayız. Bu alan içerisinde kullanılan değişkenler Literal içerisinde tanımlanmakta olan değişkenlerin ID değerleridir.

Burada yapıda olduğu gibi kendi sık kullanılan kodlarımızıda Snippetlar sayesinde ürettirebiliriz.

Tags:

.NET

CPU Sıcaklığını Okumak

by Ordinaryus 19. July 2009 03:09

 

Bazı uygulamalarda makinaların bilgilerine ulaşmak performansını kontrol etmek özellikle uzaktaki bilgisayarlarımız için önemli olmaktadır. Bunun haricinde Everest gibi ticari yazılımlarda makinanın o anki pek çok bilgisine ulaşabilmektedir. Bunların arasında CPU, Harddisk bilgileri, Fan hızları, bellek kullanımı gibi bilgilere erişmektedir.

Bunu yapmanın yolları arasında windows 200 ve sonraki sürümlerde kullanılan WMI (Windows Managment Interface) ile sağlanmaktadır. Burada WMI kullanılarak pek çok bilgiye erişmemiz mümkündür. CPU sıcaklığını kullanmam gereken bir uygulama için böyle bir kod yazmıştım. Bunun nasıl yapıldığını burada açıklamaya çalışacağım.

WMI Windows XP içerinde 900 adet özelliği donanım özelliklerini barındırmaktadır. WMI yardımıyla bu bilgilere erişmek mümkün olmaktadır. Bunlar arasında

Buradaki sınıfların kullanılması ile makine üzerindeki pek çok bilgiye ulaşmak mümkün olmaktadır.Burada anlatılacak olan uygulama için

using System.Management;

 

Ad uzayı altında kullanılan özelliklerden faydalanmaktayız. WMI nesneleri hakkında en geniş bilgi her zaman olduğu gibi MSDN üzerinde bulunmakta.

 

string scope = @"root\WMI";

string query = @"select * from MSAcpi_ThermalZoneTemperature";

 

ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query);

 

            foreach (ManagementObject obj in searcher.Get())

            {

                lblSicaklik.Text = "  "+((Convert.ToInt32(obj.Properties["CurrentTemperature"].Value) - 2732) / 10).ToString() + "ºC";

            }

 

 

Bu uygulamada sıcaklik bilgilerine nasıl ulaştığımızı görmüş olduk ancak diğer donanım özelliklerine ulaşmak, windows özelliklerini yönetmek içinde benzer şekilde MSDN üzerinden gerekli bilgiler alınarak WMI kullanılabilir.

 

Tags: ,

.NET

IP adresi girmekten sıkılanlara

by Ordinaryus 29. May 2009 14:46

 

Uzun süredir yapmak istediğim ve finallerin bitişini fırsat bilim hemen uygulamaya geçirdiğim bir projem vardı. Amaç olarak okul ve yurt arasında her gün Laptopunu taşıyan benim gibi insanlar için sürekli IP adresi girmek ve sonrasında DHCP’den IP alarak önceki IPyi yurda dönünce Static IP olarak değiştirmekten sıkılmış olanlar için hazırladım.

İlk başta IP değişikliklerini Regiterlar yardımıyla yapmaya çalışıp makinamı fazlasıyla hırpaladım ve çoğunda Static IPye geçişte problemler yaşadım. Register işlemleri Ethernet kartlarına ve Ağ adlarına ulaşmak için kullanıldığında oldukça faydalı ancak buradaki DWORD değerleri ile oynamak hiçte iyi olmamakta.

Daha sonrasında Windows sistem üzerinde kullanılan komut satırı işlemleri ile çözüme ulaşılacağını öğrendim. Burada uygulanan komutları internet üzerinden bulmak oldukça kolaydır. Bunların sürekli olarak komut satırına yazılmasındansa batch file olarak adlandırılan dosyalar kullanılmakta. Bende bu dosyaları yazdığım arayüz üzerinde editleyerek ve program üzerinden çalıştırarak uygulamayı gerçekleştirdim.

Bu uygulamanın benzer bir versiyonunu Linux içinde yapmamız mümkün burada Tcpip dosyası okunarak ve yazılarak Linuxta da herhangi bir script dili yardımıyla gerekleştirilebilir.

Aşağıda verilmekte olan metni dhcp.bat olarak kaydederek kullanabilir. Bu dosya çalıştırıldığında komut satırında dosyada yazılı olan satırları teker teker çalıştırarak otomatik IPye geçişi sağlamış olacaktır.

 

netsh interface ip set address name="Local Area Connection" dhcp

netsh interface ip set dns name="Local Area Connection" dhcp

 

Static IPye geçmek içinse kullanılması gereken komutlar makinenin IP bilgelerini DNS sunucusunu ve gateway adresini de içereceğin daha kapsamlı ve uzun süren bir işlem yapmaktadır.

netsh interface ip set address name="Local Area Connection" source=static addr=192.168.23.32 mask=255.255.255.0

netsh interface ip set address name="Local Area Connection" gateway=192.168.23.0  gwmetric=0

netsh interface ip set address name="Local Area Connection" source=static addr=192.168.23.1

netsh interface ip add dns name = "Local Area Connection" addr = 192.168.23.2

 

Buradaki bilgelerin yazılan bir arayüz üzerinden düzenlenmesi sağlanacağı gibi bunun haricinde dosyaların herhangi metin editörleri ile açılıp elle değiştirilmesi de mümkündür. Daha sonra bu batch dosyaları çalıştırılarak işlem yapılır.

 

 

 

Tags: ,

.NET

UDDI

by Ordinaryus 8. February 2009 19:08

UDDI (Universal Description Discovery and Integration)
Webservislerinin kullanılması ve yaratılma amaçları kullanıcılara yönelikhizmetlerin oluşturulması ve bu hizmetlerin dağıtılarak başka kaynaklarüzerinde de kullanılabilir olmasının sağlanmasıdır. Bu nedenlekullanıcıların ihtiyaçlarına yönelik hizmetler sağlayan Webservislerine ulaşmalarını sağlayacak bir sistem geliştirilmesineihtiyaç duyulmuştur.

Bu amaca yönelik olarak UDDI (Universal Description, Discovery and Integration) Microsoft .NET frameworkü üzerine kurulmuş bir XML tabanlı bir sistemdir. SOAP üzerinden haberleşmeleri sağlanmaktadır. Web servisine ilişkin WSDLiçerisinde ve Web sayfası içerisinde dolaşarak .disco bağlantılarınıaramaksızın Web hizmetlerine ulaşmamızı sağlar.  Evrensel Tanımlama,Keşif ve Tümleştirme  olarak da adlandırılan bu sistem internettesunulan servislere erişmemizi kolaylaştırmak için firmalar tarafındansürekli geliştirilmektedir.

UDDI, Web servislerinin sarı ve yeşil sayfalarıgibi çalışmaktadır. Bir kullanıcı ihtiyaçlarına uygun servisi UDDIsayesinde arayarak amacına uygun servisleri bulabilir, bu servislerinkaynağını ve nasıl kullanacağını öğrenebilmektedir.

  • Beyaz sayfalar: Adres, iletişim bilgileri ve belirleyici özellikler
  • Sarı sayfalar: XML Web servislerini endüstriyel sınıflandırmaya göre listeleri
  • Yeşil sayfalar: Her bir Web servisi hakkında ayrıntılı teknik bilgi sağlamaktadır.

Belirtilenuygun hizmetlerin dizinlerinin tutulması ve bu hizmetlerin takibininkolaylaşması amacıyla XML tabanlı bir kayıtlama kullanılmaktadır. Buproje sayesinde Web üzerindeki servislere ulaşmak ve bunları projeleriniçerisinde kullanmak daha mümkün olucaktır. SOA (Servis YönelimliMimari) üzerinde de pek çok fayda sağlayacak olup istenilen servishizmetlerine ulaşmak eskisinden daha kolay olucaktır. 

Tags:

WSDL

by Ordinaryus 8. February 2009 19:06

WSDL (Web Servisleri Tanımlama Dili) 

İstemcininWeb servisleri ile anlaşabilmesi için istemcinin üstünde bir Proxynesnesinin var olması gerekmektedir. Bu dosya yardımıyla istemci Webservisine ait bilgileri temin etmesi sağlanmaktadır. Bu Proxy dosyasıise .NET ortamında oluşturulup kullanılmaktadır. İstemci Web servisiile bağlantı kurmak istediğinde sunucudan wsdl uzantılı bir dokümantalep edilecektir. Daha sonra sunucudan indirilen dosya yardımıylaaradaki bağlantıyı sağlayacak Proxy nesnesi elde edilmiş olmaktadır.
WSDL (Web Service Description Language- Web Servisleri Tanımlama Dili)dosyaları ile Proxy sınıfı arasında bir bağ bulunmaktadır. WSDLdokümanları XML tabanlı olduklarından sunucudan indirilmeleri uzunsürmemektedir. İlk olarak istemciden istek geldiğinde indirilir dahasonraları sadece değişiklik yapıldığında indirilmektedir.

 

 

WSDLdokümanı, geliştirilen servise ait tüm bilgileri içermektedir.Kullanılan metotlar, bu metotların aldığı değişkenler ve geriye netür değerler döndürdüğü gibi bilgileri sunar. Temel olarak bir WSDLdokümanı 4 ana kısımdan oluşmaktadır.

  • Types (Tipler): XML standartlarına uygun olarak tanımlanmış veri tipleridir.
  • Messages (Mesajlar): İşlemin veri elemanlarını tanımlanmaktadır.
  • portType (Port Tipi): Web servislerindeki işlevleri açıklanmakta ve mesajların oluşturulması sağlanmaktadır.
  • Binding (Bağlama): Her bir port için mesajın formatı ve protokolleri tanımlanmaktadır.  
Aşağıda ise bir WSDL belgesinin temel şablonu yer almaktadır. Aşağıdakişablon oldukça karmaşık ve uzun görünmesine rağmen bunun yazılmasızorunluluğu yoktur. Bunun için düşünülmüş hizmetler .NET platformu içerisinde geliştirilmiştir.

<wsdl:definitions name="nmtoken"? targetNamespace="uri">
    <import namespace="uri" location="uri"/> *
    <wsdl:documentation .... /> ?
    <wsdl:types> ?
        <wsdl:documentation .... /> ?
        <xsd:schema .... /> *
    </wsdl:types>
    <wsdl:message name="ncname"> *
        <wsdl:documentation .... /> ?
        <part name="ncname" element="qname"? type="qname"?/> *
    </wsdl:message>
    <wsdl:portType name="ncname"> *
        <wsdl:documentation .... /> ?
        <wsdl:operation name="ncname"> *
            <wsdl:documentation .... /> ?
            <wsdl:input message="qname"> ?
                <wsdl:documentation .... /> ?
            </wsdl:input>
            <wsdl:output message="qname"> ?
                <wsdl:documentation .... /> ?
            </wsdl:output>
            <wsdl:fault name="ncname" message="qname"> *
                <wsdl:documentation .... /> ?
            </wsdl:fault>
        </wsdl:operation>
    </wsdl:portType>
    <wsdl:serviceType name="ncname"> *
        <wsdl:portType name="qname"/> +
    </wsdl:serviceType>
    <wsdl:binding name="ncname" type="qname"> *
        <wsdl:documentation .... /> ?
        <-- binding details --> *
        <wsdl:operation name="ncname"> *
            <wsdl:documentation .... /> ?
            <-- binding details --> *
            <wsdl:input> ?
                <wsdl:documentation .... /> ?
                <-- binding details -->
            </wsdl:input>
            <wsdl:output> ?
                <wsdl:documentation .... /> ?
                <-- binding details --> *
            </wsdl:output>
            <wsdl:fault name="ncname"> *
                <wsdl:documentation .... /> ?
                <-- binding details --> *
            </wsdl:fault>
        </wsdl:operation>
    </wsdl:binding>
    <wsdl:service name="ncname" serviceType="qname"> *
        <wsdl:documentation .... /> ?
        <wsdl:port name="ncname" binding="qname"> *
            <wsdl:documentation .... /> ?
            <-- address details -->
        </wsdl:port>
    </wsdl:service>

</wsdl:definitions> 

Tags:

SOAP

by Ordinaryus 8. February 2009 19:05

SOAP (Basit Nesne Erişim Protokolü)

XMLWeb servisleri içerisinde SOAP (Simple Object Access Protokol) en temelprotokollerden birisidir. SOAP Web servisinin belirlediğifonksiyonların istemci tarafından kullanılmasını sağlayan birprotokoldür. SOAP Web servisi ile istemci arasındaki bağlantınınkurallarını belirlemektedir. Bunun belirlenmesinde W3C standartlarıkullanılmakta ve bu standartlara uyulması gerekmektedir. SOAP bu iletimsırasındaki kuralların tamamını kapsamaktadır. SOAP ile veri iletimiortamdan bağımsız olarak yapılmaktadır ve XML formatındailetilmektedir. Üç temel SOAP mesajı şekli bulunmaktadır.

  • Metot çağırımı (Web servisinden istekte bulunmak)
  • Cevap mesajı (Web servisinin vereceği yanıt)
  • Hata mesajı

SOAP mesajlarının oluşumu:Metot çağırımı mesajları, istemci tarafından sunucuya gönderilenmesajlardır. Fakat bu mesajda kullanılmak istenen metot doğru birşekilde kullanılmalı ve parametreleri uygun şekilde seçilmelidir. Cevapmesajları gelen isteklerin uygun metotlarda değerlendirildikten sonrakullanıcıya döndürdüğü herhangi bir veri olabilmektedir. Hata mesajlarıise beklenmedik bir durum karşısında oluşur fakat burada zorunlu olanhata mesajının ulaşabilmesi için sunucu ve istemci arasındaki bağınkurulmuş olması gerekmektedir.
Aşağıda basit bir SOAP mesaj yapısı yer almaktadır.

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

  • Envelope (Zarf): Bütün SOAP mesajlarının içinde bulunduğu elemandır. Her SOAP mesajında muhakkak Body olmak zorundadır. Bunun yanı sıra Headerda varsa bu Bodyden önce yeralmaktadır.
  • Header (Başlık): SOAP mesajlarındaki header etiketi HTMLdeki etiketlere benzetilebilinir. Header bölümü metot çağırımı ile doğrudan bağlantılı değildir. Header bölümü meta-data dediğimiz bölümü gönderir. Meta-data terimi bilginin bilgisinin saklandığı kısım olarak tanımlanabilmektedir. Aşağıda örnek olması açısından IP adresi yollamaya yarayan bir metot çağırılmaktadır.

    <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
        <SOAP-ENV:Header>
               <IP:IPAdres xmlns:IP="www.bidb.itu.edu.tr">
                     160.75.2.120
               </IP:IPAdres>
         </SOAP-ENV:Header>
         <SOAP-ENV:Body>
         ....
         </SOAP-ENV:Body>
    </SOAP-ENV:Envelope>


    Burada SOAP standartlarında bulunmayan elemanlar için başlık alanı tanımlaması yukarıdaki gibi yapılmaktadır. IP burada bu tip bir alan adıdır ve "IPAdres"inin bunun elemanı olması sağlanmaktadır.
  • Body (Gövde): Body elemanı SOAP mesajlarının en önemli kısmını oluşturmaktadır. Metot çağırımında metodun adı ve parametrik bilgileri XML formatında bu bölgede tutulmakta ve gönderilmektedir. Cevap mesajında ise cevap yine aynı şekilde bu bölgeye eklenmektedir. Hatalar oluştuysa burada yer almaktadır. Aşağıda olası SOAP mesajlarının yapılarını gösterilmektedir.

    int SayiCarp (int sayi1, int sayi2);


    Metodu sunucumuzda bulunuyor olsun. Bu metoda erişmek için yollanılan mesajlar ve cevapları aşağıdaki gibidir.

    <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
         <SOAP-ENV:Body xmlns:OV="BIDB">
              <OV:SayiCarp>
                      <sayi1>5</sayi1>
                      <sayi2>6</sayi2>
              <OV:SayiCarp>
         </SOAP-ENV:Body>
    </SOAP-ENV:Envelope>

    Burada sayı1 ve sayı2 elemanlarının özelliklerinin oluşması WSDL (Web Service Definition Language) ile belirlenmektedir. Bu mesaja cevap olarak verilen SOAP mesajı aşağıdaki gibidir.

    <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
         <SOAP-ENV:Body xmlns:OV="BIDB”
              <OV:SayiCarpResponse>
                      <return>11</return>
              <OV:SayiCarp>
         </SOAP-ENV:Body>
    </SOAP-ENV:Envelope>


    Cevap mesajında "return" etiketi içerinde yanıtımız XML formatında gelmiştir. Burada SayiCarpResponse adlı eleman WSDL ile oluşacak elemanın bilgilerini öğrenmiştir.
    Bir SOAP mesajındaki hatalar "Fault" elemanı içerisine yazılır. Hata ile ilgili dört temel bilgi tanımlanmıştır. Bunlar hatanın tipini belirten faultcode, hatanın kısa açıklaması olan faultstring, hatanın oluştuğu sunucu faultactor ve hatanın detayları olan detail olarak sıralanır. Detail elemanı da birkaç alt elemandan oluşabilmektedir. Aşağıda klasik bir SOAP hata mesajı görülmektedir.

    <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
         <SOAP-ENV:Body xmlns:CS="www.bidb.itu.edu.tr">
              <SOAP-ENV:Fault>
                      <faultcode>Hata No : 258596</faultcode>
                      <faultstring>Zaman aşımına uğradı..</faultstring>
                      <faultactor>WS.bidb.itu.edu.tr</faultactor>
                      <detail xmlns:CS="www.bidb.itu.edu.tr">
                                 <CS:message>Gösterici Hatası...</CS:message>
                      </detail>
              </SOAP-ENV:Fault>
         </SOAP-ENV:Body>
    </SOAP-ENV:Envelope>

Tags:

SOA

by Ordinaryus 8. February 2009 19:01

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

"WindowsCommunication Foundation" (Windows İletişim Birliği), Framework 3.0 ilegelen yeniliklerden biridir. Hızlı bir şekilde servis yönelimlimimaride uygulamalar geliştirebilmek için hazırlanmış bir framework"API"'si (Application Programming Interface) olarak düşünülebilir.


Microsoftbu güne kadar dağınık mimari yaklaşımı ile "XML web servisleri","COM+", ".NET remoting", "MSMQ" gibi sistemler geliştirmiştir. "WCF"ise bunlardan sonra tüm iyi özelliklerinin birleştirildiği bir sistemolarak geliştirilmiştir. NET 3.5 ile Servis Yönelimli mimari (SOA)kullanması da önemli özelliklerinden biridir. Aslında ilk başlardanesneye yönelimli programlama (OOP) yapılmaktaydı fakat daha sonrabileşen yönelimli programlamalar ve son olarak da servis yönelimliprogramlamalar geldi ve "WCF" servis yönelimli programlamayı en iyişekilde kullanmaktadır.
"WCF"nin en önemli özelliği servis yönelimliprogramlamanın haricinde platform bağımsız bir yapısı olmasıdır. Yanibu sayede herhangi bir işletim sistemindeki uygulamalar her türlüortamda çalışabilir duruma gelmiştir.

 

 

Dikkatedilirse WCF uygulamanın yer aldığı cihaza farklı bir uygulamaalanından erişim yapabilir, farklı bir cihazdan yine aynı uygulamayaerişim yapabilir, aynı cihazda aynı uygulama alanından da erişimyapabilir. Bu sistemlerin hepsinde ortak olan nokta tüm uygulamalarservise ulaşımlarını bir "proxy" nesnesi üzerindensağlamaktadırlar. Bunun dışından "proxy" nesnesi ile kurulanbağlantının sonlanması "endPoint" 'lerde olmaktadır. Yukarıdaki resimbir bakıma dağınık mimarinin "WCF" alanındaki görünüşüdür.

Yukarıdakipastada "WCF" içerisindeki en önemli üç temel kavramdanbahsedilmektedir. Sırasıyla bunların özelliklerinden bahsedilecektir.

Adresler: Servisin bulunduğu cihazın adı ve ona ulaşım yöntemleri adres kavramıyla anlatılmatadır.
     •    Bilgisayar adı
     •    Site adı
     •    Network adı
     •    İletişim portu adı
     •    "Pipe"(boru) adı
     •    "Queue" (kuyruk) adı
     •    Belirli bir "path" (dizin) bilgisi
     •    URL adı olabilmektedir.

Taşıma protokolleri ise;
     •    HTTP (Hyper Text Transfer Protocol)
     •    TCP (Transmission Control Protocol)
     •    P2P (Peer to peer)
     •    IPC (Inter-process communication)
     •    MSMQ (Microsoft Message Queing)
Bu bilgileri taşıyan servis şablonu şu şekilde olmaktadır.

[taşıma protokolü(transport protocol)]://[makine veya domain adı]:[opsiyonel port numarası]/[opsiyonel URI bilgisi]

Sözleşmeler:Servislerin yaptıkları görevlerin bilinmesi için "proxy" sınıfıüretilmektedir ve bu sınıf yardımıyla istemciler servisle beraberçalışabilmektedirler. Bu nedenle aradaki protokolün anlaşılabilmesiiçin sözleşmeler kullanılmaktadır.

Aşağıda bu sözleşmelerden bahsedilecektir.
     •    Servis Sözleşmesi: Servis üzerinden hangi işlemlerin yapılacağını tanımlayan sözleşmelerdir.
     •    Veri Sözleşmesi:Servislerin istemcilerden gelen ve onlara giden veri tiplerinitanımlamalarını sağlayan sözleşmelerdir. Bu sayede Java gibi farklıplatformlarla haberleşmek  mümkün hale gelmiştir.
     •    Hata Sözleşmeleri:Servis tarafında meydana gelebilecek hataların ve bunların oluştuğudurumlarda kullanıcının nasıl bilgilendirileceklerini açıklayansözleşmedir.
     •    Mesaj Sözleşmesi: Servislerin mesajlarla etkileşimde olmasını sağlayan servis biçimidir.

"WCF"uygulamalarını geliştirebilmek için gereken temel tipler, Framework 3.0ile gelen System.ServiceModel.dll, System.IdentityModel.dll,System.Runtime.Serialization.dll vb... "Assembly"’ ler içerisinde yeralırlar. Bu nedenle bu "Assembly"’ leri gerektiğinde kullanabilmek içinprojelere açıkça referans etmemiz gerekmektedir.

Bağlayıcılar:Bağlayıcılar temel olarak servisler ile kurulacak olan iletişimin nasılolduğunu tanımlamak üzere kullanılırlar. Bir bağlayıcı tip taşıma tipi,protokol ve veri çözümlemesi bildirir. Bunlar servis yönelimli mimarigöz önüne alınarak hazırlanmışlardır bu nedenle "WCF" içerisinde hazırolarak yer almaktadırlar.

 

 Buradaki tiplerden ihtiyaca en uygun olanını seçilmelidir. Geliştirilecek olan "SOA" (service oriented architecture)modeline göre gereksinimleri karşılayan bir yapı seçilecek veya bunlaraalternatif olarak kullanıcı tanımlı tipler yazılacaktır. 

"WCF"servisleri iki farklı yerde barındırılabilmektedir. Bunlardan ilki "ISShosting" ile veya yazılan herhangi bir "console", "Windows application"veya "web" nesnesi üzerinden yapılabilmektedir. Burada zorunlu olan tekşey platformun Windows bir sistem üzerinden kurulmasıdır. 

 

Webservisi ve istemciler arasındaki bağlantının sağlanması için gereklitemel kavramlardan bahsedildi. Bağlantının nasıl oluşturulduğu venelere gerek olduğunu bildikten sonra "WCF" ile daha kapsamlı sunucu veistemciler üzerine çalışılabilir.

"WCF" ile istemci ve sunucu ilişkisinin oluşturulmasında altı basamak vardır.
     •    "WCF" servis sözleşmeleri oluşturulması
     •    Servis sözleşmelerini gerçeklemek
     •    Servisin sunulması ve çalıştırılması
     •    "WCF" istemcisi yaratılması
     •    İstemcinin konfigüre edilmesi
     •    İstemcinin kullanılması

Webservisleri bir veya birden çok uçnoktaya sahip olabilir. Bunların herbirine ait belli bir adres bulunmaktadır ve belli metotlar bunlaraaittir. Bu adresler sayesinde istemciler servisleri bulur ve aradakiprotokoller uygulanmaya başlar. Bu aşamada daha önce değinilen "WSDL"yardımıyla "proxy" nesnesi oluşturulur ve aradaki bağlantının kurulmasısağlanır.

 

Tags:

C# 3.0 İle Gelen Yenilikler

by Ordinaryus 8. February 2009 18:54

Bundan birkaç ay önce BIDB içinde yazmış olduğum dokumanlardan. Eski kaçtı sanırım Bloga Laughing 

 

C# 3.0 İle Gelen Yenilikler

İlkolarak 2005 yılındaki PDC (Professional Developer Conference) ileduyurulmuştur. Yenilikler içerisinde ilk göze çarpan özellik veri türütanımlama işlemlerinin yapılmasına gerek kalmamasıdır. İlk atanandeğerin türü veri türü olarak oluşturulmakta, bunun haricinde Lambdaifadeleri ve LINQ en önemli yeniliklerdir.

Tür belirtilmeden türetilen değişkenler

C#3.0 ile gelen ve en sık kullanılan özelliklerden birisidir. Yeni birdeğişken tanımlarken daha önce olduğu gibi değişkenlerin türlerinibelirtmek yerine var anahtar sözcüğü kullanılaraktürünü vermeden değişken tanımlama imkanına sahip olunmaktadır.Değişkenlerin türlerinin belirlenmesi derleme zamanındabelirlendiğinden herhangi bir performans kaybına da neden olmamaktadır.Bu özellik kullanılırken unutulmaması gereken nokta yaratılandeğişkenin o anda atama işlemine tabi tutulmasıdır yoksa bu değişkentanımı geçersiz sayılmaktadır.

var ogrenciAdi = "TestOgrenci";
var numarasi = 60519;

Console.WriteLine(ogrenciAdi.GetType());

Console
.WriteLine(numarasi.GetType());

Console.WriteLine(ogrenciAdi + "öğrencinin numarası: " + numarasi);

Buözellik kullanılırken dikkat edilmesi gereken bir diğer nokta ilktanımlama yapılırken atanan değer daha sonra başka bir atama iledeğiştirilmek istendiği takdirde yeni değerinde önceki değer ile aynıolması gerekmektedir.
Değişkenlerde olduğu gibi veri türleri oluştururken de var anahtar sözcüğü kullanılabilir.

Yapıcılandırıcıların aşırı yüklenmesi

Nesnelerinoluşturulması sırasında o sınıfa ait yapıcı yordam kullanılmaktadır.Farklı sayıda veya türde parametre kullanmak için yapıcılara aşırıyükleme yapmak mümkündür. C# 3.0 ile bu biraz daha geliştirilereknesneye ait özellikler tek bir yapıcı üzerinde tanımlanarakkullanılabilmektedir. Bu sayede girilecek parametrelerin sayısına görefarklı yapıcı yordamlar oluşturulmamış olacaktır.

public class iletisimBilgi
{

    public int telefon;

    public string adres;

}

public class ogrenci
{
    public int ID;
    public string isim;
    public iletisimBilgi iletisim;
}
var ogrenci1 = new ogrenci { ID = 34567 };

var ogrenci2 = new ogrenci { isim = "TestOgrenci", ID = 34578 };



Parçalı Metotlar (Partial Methods)

Parçalı sınıflardaki yapıya benzer şekilde C# 3.0 ile birlikte metotları da partial(parçalı)  tanımlamak mümkün olmaktadır. Böylece yazılımgeliştiricinin kodunun herhangi bir yerinde tanımlamış olduğu birmetodun işlevlerini tanımlaması için o koda bağımlı kalması gerekmez.

Metodun tanımlanması ve kullanılması farklı alanlarda yapılabilir hale gelmektedir. Parçalı metotların tanımlanması sırasında partial sözcüğü kullanılmalıdır ve her zaman void dönmek zorundadır. Parçalı metotlar tanımlandıklarında private olarak oluşturulurlar. Parçalı metotlar için delegate (temsilci) oluşturulamaz.

Genişletme Metodları (Extension Methods)

Genişletmemetotları C# 3.0 ile birlikte gelen yeni yapılar ve öncekiversiyonlarda yer alan metotların kullanımının devamının sağlanmasıiçin kullanılmaya gerek duyulmuştur. Genişletme metotları ile sahipolunan sınıflar manual (elle) yaratılmamış olsa dahi sonradan yeniözellikler katılabilmesini sağlamaktadır. Öyleki bu sayedekoleksiyonlar, datatable, dizi gibi var olan CLR (Common LanugageRuntime) tipleri üzerinde LINQ tarzı sorgu ifadelerinin yazılabilmesiolanaklı hale gelmiştir.

Genişletme metotları var olantiplere ek işlevler kazandırılmasını sağlarken bunların orijinalyapısını asla bozmazlar. Tanımlandıkları programda, uygulandıklarıtipin bir parçası olarak yaşar ama o tipin orijinalliğine etki etmedenek işlevselliklerin kullanılabilmesini olanaklı kılarlar. Genişletmemetodlarının oluşturulması sırasında unutulmaması gereken bir nokta bumetotların static olarak tanımlanma zorunluluğudur.

Lambda İfadeleri

Lambdaifadeleri C# 3.0 ile gelen belkide en önemli özelliklerden birisidir.Bunun nedenleri arasında karmaşık işlemleri basit şekilde yazılmasınaolanak sağlaması açısından yazılımcılara yararının yanı sıra LINQ konusunda da fazlasıyla kullanışlıdır.

Framework tabanlı dillerde kullanılmakta olan Lambda ifadeleri Lisp, Python gibi dillerde de bulunmaktadır. Lambda operatörü ( => )bool sonuç döndürmekte olan bir operatördür. Lambda operatörünün nedenbu kadar önemli olduğunu anlamak açısından delege (temsilci) yapısındanbahsetmek daha yararlı olacaktır.

İlk zamanlardan itibaren.NET içerisinde temsilcilere yer verilmektedir. Değişkenlerin türleriolduğu gibi yordamların da kendilerine özgü türleri vardır. Bu türleritemsil eden yapılara temsilci denmektedir. Temsilciler yordamlarınkonumlarına işaret etmektedir ve ne zaman bir yordamı kullanmak istesektemsilciler aracılığı ile onlara ulaşmak mümkün olmaktadır.

public delegate int temsilci(int carpan1, int carpan2);

public static void Main(string[] args)
{
    var temsilci1 = new temsilci(carpma);
    int carpim = temsilci1(3, 4);
        Console.WriteLine(carpim);
}
static int carpma(int sayi1, int sayi2)
{
    return sayi1 * sayi2;
}


Burada unutulmaması gereken noktalardan birisi temsilcilerinyordamların adreslerine işaret etmelerinden dolayı tanımlanan yordamlarstatic olmak zorundadır.

Aşağıda Lambda operatörü ile benzer işlemin ne kadar kısa yapabildiğini gösteren bir uygulama bulunmaktadır.


public delegate int toplama(int toplanan1, int toplanan2);
public static void Main(string[] args)
{
    toplama islem = (x, y) => x + y;
    int toplam = islem(3, 4);
    Console.WriteLine(toplam);
}


Aşağıda, lambda ifadelerinin LINQ  ile olan uygulamalarına geçilmeden önce kısaca LINQdan bahsedilmiştir.

LINQ (Language Integrated Query)

LINQdil ile bütünleşmiş sorgu kelimelerinin harflerinden oluşmuş birifadedir. Burada isminden de anlaşılacağı gibi dil içerisinde ifadelerkullanılarak yapılan sorgular akla gelmektedir. Veritabanları belki deLINQ'in isminin en çok anılmasına sebep veren alandır ama LINQ sadeceveritabanı için değil daha pek çok uygulamada kullanılabilecek gelişmişözelliklere sahiptir.

LINQ genel olarak genişletmemetotları ve Lambda ifadeleri kullanmaya dayanan bir yapıdır. Farklıkullanım alanlarına göre sahip olduğu metotlar bulunmakta ve bunlarınbelli başlıklar altında toparlanabilmesi mümkün olabilmektedir. XLINQve DLINQ bunlara örnek verilebilir. DLINQ veritabanı işlemlerindekullanılan sorguların C# dili ile gerçekleştiği şeklidir. Aynı şekildeXLINQ içinde XML içeriklerinin sorgulanmasında kullanıldığından önemlibir yere sahiptir.


List<Calisan> Calisanlar = new List<Calisan>();
Calisanlar.Add(new calisan{isim = “TestOgrenci1”, no = 123});
Calisanlar.Add(new calisan{isim = “TestOgrenci2”, no = 124});
Calisanlar.Add(new calisan{isim = “TestOgrenci3”, no = 125});
Calisanlar.Add(new calisan{isim = “TestOgrenci4”, no = 126});
Calisanlar.Add(new calisan{isim = “TestOgrenci5”, no = 127});

IEnumerable<string> sonuclar = from val in calisanlar where val.no>125 orderby val.isim select val.isim.ToUpper();

var isimler = “ ” ;
foreach(string ad in sonuclar)
{
    isimler += ad + “ ” ;
}
Console.WriteLine(isimler);

Tags:

.NET

Powered by BlogEngine.NET 1.5.0.7
Theme by Mads Kristensen

Ordinaryus Hakkında

Hayata gözlerini İzmirde açtı. 3 yaşında legolarla oynadı =) Küçük yaşta baskete başladı zaten başka sporlarla arası hiç olmadı. Orta okulda matematikle ilgilendi. Liseyi Karşıyaka Anadolu Lisesinde okudu. 

İTÜ Elektronik Mühendisliğinden 2010 yılında mezun oldu. Fizik bölümünde çift anadala kabul oldu lisans hayatına Fizikten devam etmekte. Koç Üniversitesinde Bilgisayar Mühedisliği Master programına kabul edildi ve akademik hayatının ilk adımlarını sevdiği bir alanda çalışarak atıyor. Fizik ve Bilgisayarın ortak noktalarını gördü ve bunları geliştirmek amacıyla çalışıyor.

Yazılımı sevdi.. Başlarda herşeyle ilgilendi web programlama da yaptı, sokette programladı yeri geldi ağ yönetimi ile uğraştı. Görüntü işlemeden keyif aldı Makine Öğrenmesi ve Örüntü Tanımada kendisini geliştirmeyi istemekte.

2008te MSP oldu belkide bu blogu yazmaya başlamasında en büyük etken=) Bu görevi 2 sene boyunca sürdürdü. Bir yandan 2008de EuroSkillsde Mobil Robotik alanında Türkiyeyi temsil etti. Ardından 2009da Kanada da tekrardan yarışmacı olarak bulundu. Artık bu alanda hakemlik yaparak ve Robotino hakkında öğrendiklerini paylaşarak faydalı olmaya çalışıyor. 

Yapay Zeka, Görüntü İşleme, Kuantum Mekaniği, İstatistik Mekanik ve Bilişsel Bilimlerle ilgili. Geceleri kafasına göre takılıyo. Sabahlarıda öğrencilik yapıyo =)

gibi gibi... 

 

Page Rank

Loading

Google Translate


Şuan ne okuyorum

Bilişsel Psikoloji

Singularity is Near


Ayrıca okuduklarımdan seçtiğim kitaplara buradan ulaşabilirsiniz..

Okuduklarımı üye olarak takip etmek için ise aşağıdaki RSS bağlantısını kullanabilirsiniz. Ayrıca bana kitapta hediye edebilirsiniz =)


CCL


Copyright © Ordinaryus Says That by http://www.vypro.org/ is licensed under a Creative Commons Attribution-No Derivative Works 3.0