Home Contact RSS

Archive for May, 2008

Mobile development blog

Kivanc Ozuolmez is an another Turkish MVP who blogs in English. If you are interested in mobile technologies and mobile development, don’t forget to subscribe to his blog to catch the latest news and stuff about mobile technologies.

http://www.kvnc.net/

Recent News

Microsoft MVP Global Summit was amazing this year. New contacts and friends, latest news about incoming Microsoft products, a lot of know-how. Everything was amazing. Here is a picture of mine taken by Cenk CAGLAR in Microsoft Corporate Campus, Seattle.

DSC01274

On the other hand, I have been re-awarded the Microsoft MVP award for the 3rd time. I would like to thank the Microsoft MVP Team both at Microsoft and at Microsoft Turkey for the opportunities that they have been providing for last 2 years. It is great pleasure to work together with them.

Further more, I have been in Istanbul for a long time for some reasons. Finally, I am back in Propeople Sofia office since April 28.

Makale 14: Remoting Uygulamalarının “Performance Counter”lar ile İzlenmesi

.NET içerisinde bulundurduğu hazır class’lar sayesinde uygulamanızın Windows Performans Monitor ile son derece kolay bir şekilde etkileşim kurabilmesini sağlamaktadır.

Performans Monitor, Control Panel içerisinde bulunan “Administrative Tools” klasörü içinde “Performance” isimli shortcut’a tıklayarak ulaşılır ve ilk açıldığında aşağıdaki görüntüye sahiptir.

Performans Monitor üzerinde yeni bir monitör ekranı açmak istendiğinde “New Counter Set” butonuna tıklanır.

Yeni counter set’inde hiçbir counter bulunmaz. Bu boş counter set’ine yeni performance counter’ları eklemek için “Add” butonuna tıklanır.

Açılan ekranda “Performance object” seçeneği ile ne tip bir performance counter ekleneceği seçilir. .NET ile ilgili performance object’leri ekran görüntüsünde de görüldüğü gibi şu şekildedir:

Add Counters ekranında “Explain” butonuna tıklanarak performance counter hakkında detaylı bilgi alınır:

Instance seçim bölümünde uygulama seçilerek “Add” butonuna tıklanır:

Performance counter eklendikten sonra “Add Counters” ekranı başka performance counter’ların ekleneceği düşünülere kapatılmaz. Kapatılmak istendiğinde “Close” butonuna tıklanır. “Close” butonuna tıklandıktan sonra geri dönülen ekranda bulunan performance counter listesinde eklenmiş olan counter bulunur.

Bu işlemleri yaptıktan sonra seçmiş olunan uygulamaya bağlanacak olan Remoting client’ı run edilir ve ekrandaki değerler gözlemlenir.

Uygulama tekrar çalıştırıldığında değerler kaldığı yerden tekrar artacaktır.

.NET Framework’ün System.Diagnostics namespace’i altında bulunan PerformanceCounter class’ı Performance Monitor uygulamasının ekranda grafiksel olarak gösterdiği bilgilere, uygulamanın programmatic olarak erişebilmesini sağlar. Bu sayede yazılımcılar kendilerine özel performance monitor uygulamaları geliştirebilirler ve ihtiyaçlarına özel raporlar oluşturabilirler.

Daha önceden geliştirmiş olduğumuz MyFirstRemotingService project’i içerisinde bulunan MyRemotableType class’ını aşağıdaki şekilde değiştirerek, uygulamanın RequestCount method’u içerisinde PerformanceCounter class’ını kullanarak aldığı bilgiyi döndürmesini sağlayabiliriz.

MyRemotableType.cs

using System;
using MyFirstRemotableType;
using System.Diagnostics;
namespace MyFirstWindowsService
{
    public class MyRemotableType : MarshalByRefObject, IMyRemotableType
    {
        PerformanceCounter perfCounter;

        public MyRemotableType()
        {
            perfCounter = new PerformanceCounter();
            perfCounter.CategoryName = ".NET CLR Remoting";
            perfCounter.CounterName = "Total Remote Calls";
            perfCounter.InstanceName = "MyFirstWindowsService";
            perfCounter.MachineName = Environment.MachineName;
        }

        public DateTime GetServerDateTime()
        {
            return System.DateTime.Now;
        }

        public int RequestCount()
        {
            return Convert.ToInt32(perfCounter.NextValue());
        }
    }
}

PerformansCounter class’ının CategoryName özelliği Performance Monitor uygulamasına counter eklerken seçtiğimiz “Performance object” seçeneğine denk gelmektedir. Bu özelliğe “Add Counters” ekranında görmüş olduğunuz herhangi bir değeri string olarak atayabilirsiniz.

PerformansCounter class’ının CounterName özelliği “Add Counters” ekranındaki “Counter” seçeneğine denk gelmektedir. Bu özelliğe “Add Counters” ekranında, “Counters” bölümünde görmüş olduğunuz herhangi bir değeri string olarak atayabilirsiniz.

PerformansCounter class’ının InstanceName özelliği “Add Counters” ekranındaki “Instance” seçeneğine denk gelmektedir ve instance listesinde bulunan uygulamalardan hangilerinin bu counter ile ölçüleceğini belirlemek için kullanılır. Bu özelliğe “Add Counters” ekranında, “Instances” bölümünde görmüş olduğunuz herhangi bir değeri string olarak atayabilirsiniz.

PerformansCounter class’ının MachineName özelliği Performance Monitor uygulamasına counter eklerken seçtiğimiz “Counter” seçeneğine denk gelmektedir. System namespace’inde bulunan Environment class’ının sahip olduğu static access-modifier’ına sahip MachineName özelliği uygulamanın üzerinde çalıştığı bilgisayarın ismini verdiğinden, sabit değer verilmek istenmemesi durumunda bu özelliğin atanması mümkündür.

PerformansCounter class’ının NextValue method’u counter’ın üzerinde gerekli hesaplamaları yaparak hesaplanan değeri geri döndürür.

Makale 13: Remoting Uygulamalarında Hata Ayıklanması ve Dağıtım

Giriş

“Uygulama çok yavaş çalışıyor!” cümlesi bir developer’ın en son duymak isteyeceği cümledir. Bir şekilde duyduysak da artık uykusuz gecelere hoşgeldin demenin vakti gelmiş demek oluyor.

Fakat uykusuz gecelerin sebebi sanıldığı gibi yavaşlıkların sebebinin bulunması değil, optimizasyonların yazılması. Peki nasıl oluyor da yavaşlıkların ve performans kayıplarının bulunması bu kadar olabiliyor diye düşünenler için cevap çok net, Windows’un sunmuş olduğu “Performance Monitor”.

Uygulamalar bazen sadece yoğun olarak çalıştıkları durumlarda, örneğin 10 kullanıcının aynı anda bağlı olması, çeşitli sorunlar çıkartabilirler. Bu durumda uygulamayı debug edebilmek için tek şansınız çalışır halde, uygulamanın client’lara sunduğu servisleri aksatmadan duruma müdahale etmektir. Remoting uygulamalarının debugging işlemi bu sebeplerden dolayı çeşitli sorunlara neden olabilmektedir. Fakat uygun condition’lar oluşturulduğunda bu sorun rahatlıkla aşılabilmektedir.

Remoting’in getirmiş olduğu en önemli avantajın farklı environment’lar kullanılarak host edilebileceği olduğundan bahsetmiştik. Örneğin ASP.NET uygulamaları, Console Application’lar ve ya NT Service’leri. Tüm bu opsiyonları karşılaştırarak en uygun seçeneği bulmanız gerçekten önemli bir konu.

Bu chapter sonunda aşağıdaki konular hakkında bilgi sahibi olacağız;

  • Performance Monitor’ü kullanımı,
  • Remoting uygulamalarının debug edilmesi,
  • Remoting server’ının host edilmesi.

Host and Deploy a Remoting Application

.NET Framework remoting uygulamarının aşağıdaki seçenekler üzerinde host edilmesine imkan tanır.

  • IIS
  • Windows Service (NT Service)
  • Windows Application
  • Console Application

IIS

Host seçeneğinin Internet Information Services (IIS) olarak yapılması IIS’in kendi içerisinde bulunan güvenlik seçeneklerinin (SSL, certificates, etc.) uygulamaya herhangi bir ek kodlama gerektirmeden eklenebilmesini sağladığı için avantajlıdır. IIS seçeneği seçildiğinde channel’ın üzerinde çalışacağı protocol yalnızca HTTP olabilir.

Windows Service

Hata oluşması durumunda Windows servislerinin sahip olduğu otomatik tekrar başlama özelliği sayesinde çeşitli hataların oluşması durumlarına karşı en avantajlı seçenektir. Uygun ayarların yapılması durumunda sistemin başlaması sonrasında, herhangi bir kullanıcının logon olmasına gerek olmadan, otomatik olarak çalışma özelliğine sahiptir.

Windows Service’leri System.ServiceProcess.ServiceBase class’ından inherit edilerek yazılmaları gerekmektedir. OnStart ve OnStop method’larının override edilmesi durumunda servisin başlatılmasında ve durdurulmasında yapılacak olan işlemler kolaylıkla develop edilebilir.

Windows Application

Uygulamanın çeşitli parametrelere göre test edilmesi gibi durumlar sözkonusu olduğunda sunduğu görsel arabirim çeşitli avantajlar getirebilmektedir. Uygulamanın kapanmasına sebep olacak bir exception throw edilmesi durumunda otomatik tekrar başlama şansı olmadığı için production environment’ta kullanılmamalıdırlar. Fakat Windows Application’ları genellikle Remoting server yerine Remoting client development’ında kullanılırlar.

Console Application

Test aşamalarında kolay olarak çalıştırılabilmesi ve kolay debug edilebilmesi sebebiyle kullanılabilir. Remoting server’ları genel olarak bu uygulama tipinde develop edildikten sonra Windows Service uygulaması haline convert edilirler.

Örnek Windows Service Uygulaması

1.     Visual Studio’yu çalıştırın.

2.     File > New menüleri altındaki Project seçeneğini seçin.

3.     Visual C# > Windows seçeneği altındaki Windows Service proje tipini seçin.

4.     Name property’sine MyFirstWindowsService yazın.

5.     Location property’sine projeyi oluşturmak istediğiniz klasörün path’ini yazın ve ya Browse seçeneğini kullanarak path’i gösterin.

6.     Solution Name property’si otomatik olarak MyFirstWindowsService şeklinde değişir, eğer değişmemiş ise bu property’ye de MyFirstWindowsService yazın.

Bu işlemler sonrasında New Project ekranı aşağıdaki şekilde görünür:

NOT

Location property’sinde yazmakta olan “C:\Path\to\Your\Project” path’i seçmiş olduğunuz path’e göre değişiklik gösterektir.

7.     OK butonuna tıklayın.

8.     Karşınıza “Service1.cs” isimli bir dosya açık olacak çıkar.

9.     Bu dosyanın ismini Solution Explorer penceresi yardımı ile “MyFirstService.cs” olarak değiştirin.

10.  Visual Studio “Service1.cs” dosyasının ismini değiştirdikten sonra bu dosya içerisindeki “Service1″ isimli class’ın ismi otomatik olarak “MyFirstService” şeklinde değişir. Değişmemesi durumunda class’ın ismini “MyFirstService” olarak değiştirin.

11.  Solution Explorer penceresindeki References klasörüne sağ tıklayarak “Add Reference” seçeneğine tıklayın.

12.  Karşınıza “Add Reference” penceresi çıkar. Bu pencerede “.NET” tab’ındaki “System.Runtime.Remoting” assembly’sini seçin ve OK butonuna tıklayın.

13.  Solution Explorer penceresindeki References klasörüne sağ tıklayarak “Add Reference” seçeneğine tıklayın.

14.  Karşınıza “Add Reference” penceresi çıkar. Bu pencerede “Browse” tab’ını seçerek “MyFirstRemotableType” project’inin bulunduğu klasöre gidin.

15.  Bu klasör içerisinde de sırasıyla “bin” ve “Debug” klasörlerine girerek “MyFirstRemotableType.dll” isimli assembly’yi seçin ve OK butonuna tıklayın.

16.  Project’e MyRemotableType.cs isminde yeni bir Class dosyası ekleyin.

17.  MyRemotableType.cs dosyasının içeriğini daha önce develop etmiş olduğumuz MyFirstRemotingServer projesindeki ile aynı fakat tek farkı namespace bilgisi “MyFirstWindowsService” olarak, aşağıdaki şekilde yazın:

MyFirstService.cs dosyasına import edilecek namespace’lerin import edilişleri

using System;
using MyFirstRemotableType;
namespace MyFirstWindowsService
{
    public class MyRemotableType : MarshalByRefObject, IMyRemotableType
    {
        int requestCount;

        public MyRemotableType()
        {
            this.requestCount = 0;
        }

        public DateTime GetServerDateTime()
        {
            requestCount++;
            return System.DateTime.Now;
        }

        public int RequestCount()
        {
            return requestCount;
        }
    }
}

18.  MyFirstService.cs isimli dosyaya sağ tıklayarak “View Code” seçeneğine tıklayın. Karşınıza servisin kodları çıkar.

19.  MyFirstService.cs dosyası içerisinde aşağıdaki namespace’leri import edin:

MyFirstService.cs dosyasına import edilecek namespace’lerin import edilişleri

using System;
using System.Collections;
using System.ServiceProcess;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;
using MyFirstRemotableType;

20.  OnStart method’unu aşağıdaki şekilde yazın:

OnStart method’u implementation’ı

protected override void OnStart(string[] args)
{
    IDictionary channelProperties = new Hashtable();
    channelProperties.Add("name", "MyTcpChannelName");
    channelProperties.Add("port", "4444");
    channelProperties.Add("priority", "1");

    TcpChannel tcpChannel = new TcpChannel(channelProperties, new BinaryClientFormatterSinkProvider(), new BinaryServerFormatterSinkProvider());

    ChannelServices.RegisterChannel(tcpChannel, false);

    RemotingConfiguration.RegisterWellKnownServiceType(typeof(MyRemotableType), "MyRemotableType.rem", WellKnownObjectMode.Singleton);
}

21.  OnStop method’u içeriğinde herhangi bir değişiklik gerekmemektedir.

22.  MyFirstService.cs dosyasına sağ tıklayarak “View Designer” seçeneğine tıklayın.

23.  Karşınıza gelen ekranda sağ tıklayarak “Add Installer” seçeneğine tıklayın.

24.  Ekranda iki yeni object belirir.

25.  serviceProcessInstaller1 ismindeki object’in type’ı System.ServiceProcess.ServiceProcessInstaller class’ıdır ve Account özelliği sayesinde servisin hangi user account’unu kullanarak çalıştırılacağı belirlenebilir. Bu özellikler User, LocalService, LocalSystem ve ya NetworkService seçeneklerinden birisi olabilir.

26.  serviceInstaller1 ismindeki object’in type’ı System.ServiceProcess.ServiceInstaller class’ıdır ve servisin Description, DisplayName, StartType, ServiceName gibi özelliklerine sahiptir.

27.  serviceProcessInstaller1 object’inin Account özelliğini “LocalService” olarak değiştirin.

28.  serviceInstaller1 object’inin Description özelliğini “This service hosts my first remoting server” olarak değiştirin.

29.  serviceInstaller1 object’inin DisplayName özelliğini “My First Remoting Server” olarak değiştirin.

30.  serviceInstaller1 object’inin StartType özelliğini “Automatic” olarak değiştirin.

31.  serviceInstaller1 object’inin ServiceName özelliğini “MyFirstRemotingServer” olarak değiştirin.

32.  Project’i “Build” menüsünü kullanarak build edin.

33.  Visual Studio’yu kapatın.

34.  Visual Studio 2005 Command Prompt’u açın.

35.  InstallUtil.exe C:\Path\to\Your\Project\bin\Debug\MyFirstWindowsService.exe komutunu yazarak çalıştırın.

NOT

1.    InstallUtil.exe uygulaması Windows Service’lerinin kurulması işlemini gerçekleştirmektedir.

2.    InstallUtil.exe -u parametresi ile kullanıldığında servisi uninstall etmektedir.

3.    Komut içerisinde verilen C:\Path\to\Your\Project path’i project’inizi oluşturduğunuz klasöre uygun olarak değiştirilmelidir.

36.  Komut çalıştırıldığında karşınıza servisin hangi user account’unu kullanarak çalıştırılmak istendiği sorusu sorulacaktır. Buraya uygun bilgileri girin.

37.  Bilgileri girip OK butonuna tıklayın.

38.  Başarılı bir kurulum sonrasında command prompt şu mesajı gösterecektir: “The Commit phase completed successfully. The transacted install has completed.

39.  Control Panel’e gidin.

40.  Administrative Tools klasörüne girin.

41.  Services shortcut’ına çift tıklayın.

42.  Service listesi içerisinde My First Remoting Server isimli service’in yer aldığını göreceksiniz.

43.  Service’i çalıştırmak için sağ tıklayın ve Start seçeneğine tıklayın.

44.  Service başlatılacaktır.

45.  MyFirstRemotingClient isimli console application’ını çalıştırın ve bu işlem sırasında MyFirstRemotingServer isimli console application’ının çalışmadığından emin olun. Bunun sebebi her iki uygulamanın da 4444. portu kullanıyor olması ve ikisinin aynı anda çalışamayacak olmasıdır.

46.  MyFirstRemotingServer uygulaması çalışmıyor olduğu halde Remoting client’ı çalışacaktır.

47.  My First Remoting Server isimli service’i stop edin.

48.  MyFirstRemotingClient isimli console application’ını tekrar çalıştırın.

49.  Windows servisini durdurduğumuz durumda MyFirstRemotingClient isimli console application’ının çalışmadığını gördünüz.