Arda Çetinkaya Yazılım ve arada kendim ile ilgili karaladıklarım…

Geçen hafta ayıptır söylemesi, Barselona’daydım…19 Mayıs’ı tatil olarak algılayan “apolitik gençler”(!!) olarak güzel bir tatil geçirdik. Yaklaşık 6 günlük dolu dolu bir tatil…Kafa dağıttım, eğlendim, gezdim, tozdum…Kendi adıma çok güzel bir zaman dilimi geçirdim diyebilirim…Bana eşlik eden Ezgi’nin katkısı da olaya daha bir anlam kattı.Söylemeden edemeyeceğim…

Yüzsüzlük yapıp, bu güzel günlerimi burada paylaşmak istiyorum…Barselona’ya gitmek isteyen ya da gitmeyi planlayan kişilere biraz bilgi, biraz da heyecan katmak adına…Yazı dizisi şeklinde yazıyor olacağım, o yüzden beni takip edin anaaacıııımmmm….

Barselona’ya geldik…Cidden…

İlk gün yurt dışı gezilerinde önemlidir…Uçak havaalanına iner, uçaktan inilir, “bavulum da gelmişmidir acaba” korkusu yaşanır ve daha sonra etrafta ne olup bitiyor, oradan buraya nasıl gidiliyor, şurdan nasıl geliniyor bunlar öğrenilmeye çalışılınır genelde…Otele varma çabası da ulaşım ağını anlama konusunda pratik bir çalışma olur. Bu kısımlar sorunsuz atlatılırsa ilk gün ayrı bir güzel geçer…Biz de, Antonio Banderas genlerimden dolayı olacak bu çalışma içerisinde çok fazla debelenmeden, Barselona’daki otelimize çok rahat bir şekilde ulaştık derdim ama Antonio Banderas genlerime gerek bile kalmadan, Barselona’da ki ulaşım ağı bizi zaten götürdü gitmek istediğimiz yere…Hostelden hallice, otelimize…

Barselona’da ki en büyük ve yoğun şekilde kullanılan havaalanı, El Prat oluyor…Buradan şehir merkezi dediğimiz insanların yoğun olduğu bölgeye bir çok ulaşım yöntemi var ama en kolayı AeroBus denen otobüsler. Otobüsün kalktığı yeri sorup, hemen oradan bilet alıp bu otobüs ile şehir merkezine gitmeniz mümkün. Çok sık otobüs var o yüzden kaçırırım, yok saatleri ne acaba triplerine hiç gerek yok, benden söylemesi. Ha bilet alırken, döneceğinizi de düşünerek gidiş dönüş bileti alırsanız, Barselona’daki ilk harcamanız çok da fazla koymaz. 🙂

Bu AeroBus denen otobüs şehir merkezinde bir kaç durakda duruyor. Kalacağınız yere en yakın yerde inmeniz en doğrusu olacaktır, ilk günden elleriniz de bavullar ile gençlik ateşine bürünmeye gerek yok. O ateş daha sonra çok gerekecek…

Antonio Banderas ve Penelope Cruz ikilisi olarak şehir merkezine(La Rambla) geldiğimiz de “Ulan buralar eskiden dutluktu” bakışı, “Barselona’dayız lan” jetonunun düşme sesi ile bozulsa da, istifimizi hiç bozmadan en yakın metro istasyonuna doğru yola koyulduk. Elimizle koymuş gibi tam buluyorduk ki, metrodaki görevli insan dostu kişi elimize bir metro haritası tutuşturdu, enayilik yapmayın bu biletten alın diye de yardımcı oldu saolsun…Barselona’da ulaşım için çeşit çeşit bilet var..Her ihtiyaca göre…T10 denen 10 binişlik kart alın direk en temizi…7.85 euro…Mis…

Elimize metro haritası tutuşturan görevli insan dostu kişi ile iletişim konusunda yaşadığımız sorundan dolayı, hemen Shakespeare kıyafetimi çıkardım ve ispanyol edebiyatının önde gelen birinin kıyafetini giymeye çalıştım ama beceremedim…Geyik bir yana bu Barselona’dakiler ingilizce konusunda pek iyi değiller. Ciddi bir şekilde dil sorunu yaşamak mümkün. Ama yaşasın tarzanca…Bir şekilde iletişim kurma canlısı olduklarından, anlaşmak mümkün… Bu noktada az biraz öğrendiğim ispanyolcanın faydasını da görmedim değil…Neyse…

Metro haritasını çözdükten sonra otelimize geldik. MelonDistrict Marina diye hostel tarzı bir yerde kaldık. Ucuz, temiz, ulaşım acısından kolay…Tavsiye ederim…İngilizce bilen resepsiyon görevlisi, “Aaa erken gelmişsiniz, odanız hazır değil” şeklinde karşılaması yorgun olduğumuzu hatırlatsa da, daha demin bahsettiğim gençlik ateşi ile “Bavulları bırakıyoruz, oda hazır olunca çaldır, ararım ben seni” cümlesini kurup otelden ayrılıyoruz. Etrafta ne var, ne yok gezisine başlıyoruz…

Kaldığımız yer ne diye geçiyordu bilemiyorum ama kaldığımız yer “Port Olimpic” dene bölgeye yürüyerek 15 dakikalık bir mesafede, şehir merkezine de metro ile 7-8 dk bir mesafedeydi. Kısacası mis…Yol yordam bilmeyen biz, etrafda yürüyerek ilk günün keyfini çıkarmaya başladık.

Devam…

Çok hoşuma gitti, www.smbc-comics.com‘den çaldım…

Yine bir MEF yazısı…Bu sefer MEF’in kullanım alanlarını inceleyerek MEF’in gerçekten faydalı olabileceğini biraz daha net bir şekilde kavramaya çalışacağız. Bir önceki yazımda, Asp.Net MVC Framework’de “Controller” kavramını basitçe özetleyerek kendi çapımda anlatmaya çalışmıştım. Ne kadar faydalı oldu bilemeyeceğim ama bu sefer de, Asp.Net MVC Framework’de MEF’i nasıl uygulayabiliriz bunu anlatmaya çalışacağım.

Başlıyoruz…

Asp.Net MVC uygulaması olarak, Visual Studio’da proje olarak gelen Asp.Net MVC projesini kullanıyor olacağız. Baştan bir MVC uygulaması yazmaya şimdi gerek yok, hazır yazılmışı olduğunu farz ederek bu proje şimdilik işimizi görecektir.

Aşağıdaki gibi bir proje yapımız olduğuna göre, tam olarak ne yapacağız buna geçelim. Amacımız MEF’in esnekliğini kullanarak Asp.Net MVC uygulamamızı esnetmek. Yani takıp çıkarabileceğimiz, bir birinden bağımsız bileşenler ile uygulamamıza genişletebilir bir yapı yapmak. Bu noktada takıp çıkarabileceğimiz bileşenler derken bunların “Controller”lar olduğunu belirtmekte fayda var sanırım.

“Controller”ların takıp çıkarılması olayını biraz daha açıp, “Controller”ların ayrı *.dll’ler şeklinde Asp.Net MVC uygulamamıza entegre olabilen bileşenler demek sanırım daha açık olacaktır.

Önce “Controller”ımızı yapalım…

Takıp çıkarılabilen bir “Controller” için Visual Studio’da yeni bir “Class Library” projesi yapmamız gerekmekte. Bu projenin çıktısı bizim MVC uygulamamıza dışardan ekleyebileceğimiz “Controller”ımız olacak. Projemizin aşağıdaki gibi bir yapısı olması gerekmekte. (Not: Poll ismini bu örnekte anket yaptığımızı farz ederek koydum)

Index.asp’miz View tarafımız *.cs dosyamız ise “Controller”ımız olacak. Aşağıdaki kod örneği de şimdilik yeterli olacaktır.

using System.Text;
using System.Web.Mvc;
using System.ComponentModel.Composition;
using Common;

namespace Plugins.Poll
{
    [Export("MVCController",typeof(IController))]
    [PluginMetadata("Poll", "1.0", "Arda")]
    [PartCreationPolicy(CreationPolicy.NonShared)]
    public class Poll : Controller
    {
        public ActionResult Index()
        {
            return View("~/Plugins/Views/Poll/Index.aspx");
        }
    }

}

Devam…

Asp.Net MVC nedir, ne değildir yazısı olmayacak bu baştan söylemekte fayda var sanırım.  Asp.Net MVC Framework’ün arka tarafında olan bir kaç işlemi anlamaya çalışacağız. Öncelikle Asp.Net MVC Framework, IHttpHandler arayüzünden türeyen MVCHandler ve çevresinde dönen, Asp.Net Framework’ü kullanılarak geliştirilen ayrı bir framework. Aslında Amerika’nın yeniden keşfedilmesini sağlayan bir kavram(!) ya da Mars’a roket göndermemize yardım eden bir teknoloji değil.

Asp.Net’deki IHttpHandler arayüzü, web ortamında, gelen “request”leri,yada içerikleri(context) kontrol etmemizi ve “response”ları yaratmamızı sağlayan bir arayüz. Eminim bir çoğumuz kendi “Handler”larımızı bazen yazma gereği duymuşuzdur. Asp.Net MVC Framework de belli amaçlara ulaşmak için Microsoft’un kendi “Handler”larını yazması ile ortaya çıkıyor işte. Kaynak kodlarına baktığımız zaman zaten bunu daha iyi anlayabiliyoruz.

Şimdi Asp.Net MVC Framework, gelen bir HTTP request’ini alıyor, kendi yorumlayabileceği yapıya dönüştürüp(ki burası da Routing mekanizması oluyor aslında), kendi içinde işliyor. Bu noktada da karşımıza “Controller” kavramı çıkıyor. Kendi içinde işlediği nokta bu “Controller” kısmı oluyor. Daha sonra da bu “Controller” kavramı “View”leri oluşturuyor. Hatırlarsanız az önce IHttpHandler’ın “response”ları yaratmamıza yardım ettiğini söylemiştim. Buna şimdi ek olarak da, IHttpHandler’ın daha doğrusu, bu arayüzden türeyen MVCHandler’ın “Controller”ların yaratılmasını sağladığını söylemek istiyorum. Yaratılmasını sağlıyor dedim dikkat ederseniz. Yani direk kendi yaratmıyor. Bu nokta çok önemli.

Asp.Net MVC Framework’de “Controller”ların yaratılmasını “DefaultControllerFactory” sağlıyor. Evet, tahmin ettiğiniz gibi bir tasarım kalıbı…DefaultControllerFactory, CreateController() metodu ile request sonucu oluşan içeriği(context) alır ve ilgili “Controller” sınıfını oluşturur. Asp.Net MVC Framework’de bu DefaultControllerFactory’nin oluşmasını, ControllerBuilder objesi sağlar.

Şimdi yavaş yavaş biraz daha eğlenceli yerlere geliyoruz aslında. Asp.Net MVC Framework, bize bu “Controller” yapısına gerektiğinde müdahale etmemiz için çeşitli metodlar ve arayüzler sunuyor. DefaultControllerFactory’nin de türediği IControllerFactory arayüzü bunlardan biri. Bu arayüzden kendi ControllerFactory’lerimizi yaratabiliriz. Dolayısıyla kendi “Controller”larımızı yaratabiliriz. Bu sayede “Controller”larda ortak operasyonları gerçekleştirebiliriz. Yukarıda bahsettiğim CreateController() metodu da bu arayüzden geliyor. Bu metod RequestContext tipinde  bir değer alıyor. Bu sunucuya yaptığımız “request”in anlamlı hale geldiği objemiz oluyor. Bir diğer parametre de adından da anlaşıldığı üzere “Controller”ın ismi…

İlerleyen yazılarda kendi kontrol fabrikamısı(:)) yaratıyor olacağız ve bütün bu laf kalabalığını biraz daha anlamlı hale getireceğiz.

Umarım kafalar fazla karışmamıştır. Bu kavramları bilmek gerekli mi diye sorabilirsiniz, ya da gerekli olmadığını savunabilirsiniz…Ama küçük bir proje için derinlere dalıp, biraz debelenmem gerekti. Sonuçlarını da paylaşma gereği hissettim. Önümüzdeki yazılarda bu kavramları kod örnekleri ile daha da anlamlı kılıyor olacağım. Şimdilik bu kadar…

Team Foundation Server(TFS) 2010’nun WSS tarafındaki “dashboard”unda;

“Default value or value provided for the report parameter ‘StateParam’ is not a valid value. (rsInvalidReportParameter)”

şeklinde bir mesaj ile karşılaşıyor olursak, yapmamız gereken küçük bir kaç şey var. Öncelikle bu hatayı, Reporting Service’in raporları doğru oluşturamamasından dolayı aldığımızı söylemekte fayda var sanırım. Bunun da nedeni, TFS üzerinde oluşturduğumuz bir projeyi silip, aynı isimle farklı bir proje oluşturmamız olabiliyor. Ama bunun da temelinde ve genel olarak bu hatanın arkasında Reporting Services’in beraber çalıştığı Analysis veritabanında rapor için ilgili bilgilerin toplanamaması. Peki çözümü ne?

TFS 2010 ile arka tarafta çalışan yeni bir kaç web servis geldi. Bunlar TFS 2010’nun kendi içinde ki bazı operasyonları yönetebilmek ve TFS’in dışardaki sistemler ile iletişimini sağlamak için bir kaç web servis. Bu web servislerden birini kullanarak yukarda bahsetmiş olduğum hatayı çözüyor olacağız.

Bunun için TFS’in yüklü olduğu bilgisayarda “http://[Team Foundation Server adresi]:8080/tfs/TeamFoundation/Administration/v3.0/WarehouseControlService.asmx” adresine gitmemiz gerekmekte. TFS’in yüklü olduğu bilgisayarda bunu yapıyor olmamız çok önemli.

Bir çok farklı web metodu karşımıza çıkıyor olacaktır. Bunlardan “ProcessAnalysisDatabase” metoduna tıklayıp aşağıdaki gibi “Full” ifadesini processingType parametresinin değeri olarak yazmamız gerekmekte.

Invoke dediğimiz de True ifadesini alıyor olmamız gerekmekte. TFS 2010’un “dashboard”u bu işlemden sonra kontrol ettiğimizde sorunun düzelmiş olduğunu görüyor olacağız…