Caner Tosuner

Leave your code better than you found it

ADO.Net Entity Framework Hız Testi

Bu makalede local'de bulunan northwind database'ine bağlanarak Customers tablosunda bulunan müşterileri hem ADO.Net hem de Entity Framework kullanarak alıp array içerisine atacağız ve iki işlem arasındaki hız farkını ölçmeye çalışacağız.

 

Entity Framwork'ün developerlara ne derece kolaylık sağladığını biliyorsunuzdur.Normal şartlarda ADO.Net kullanarak ortalama 20 satır kodla yaptığınız işlemleri Entity Framework ile %60 daha az kod yazarak yapabiliyoruz. Düşünüldüğü zaman inanılmaz bir durum ve zamandan kazanç sağlamak için muhteşem bir mimari. Bende aynen böyle düşünüyordum taki aradaki hız farkının en kötü şartlarda bile 3 kattan daha fazla olduğunu öğrenen kadar. Gelin aşağıda örneğimizi inceleyerek devam edelim. 

 

Öncelikle Northwind database'inde bulunan Customers tablosunun colonlarını aşağıda olduğu gibi classlaştırıyoruz

public classCustomer
    {
        public int CustomerID { get; set; }
        public string CompanyName { get; set; }
        public string ContactName { get; set; }
        public string ContactTitle { get; set; }
        public string Address { get; set; }
        public string City { get; set; }
        public string Country { get; set; }
        public string Phone { get; set; }
    }

 

Sonrasında ADO.Net ile database'de kayıtlı bulunan müşterilerin bilgilerini alıp Customer objesinden bir List array'in içerisine dolduruyoruz,

public List<Customer> GetCustomers_By_ADO()
{
List<Customer> AllCustomers = newList<Customer>();
 
SqlConnection conn = newSqlConnection("Server=CT;database=Northwind;trusted_connection=True");
SqlCommand cmd = newSqlCommand("select * from Customers", conn);
conn.Open();
SqlDataReader dr = cmd.ExecuteReader();
while (dr.Read())
{
AllCustomers.Add(newCustomer()
{
CustomerID = dr.GetString(0),
CompanyName = dr.GetString(1),
ContactName = dr.GetString(2),
ContactTitle = dr.GetString(3),
Address = dr.GetString(4),
City = dr.GetString(5),
Country = dr.GetString(8),
Phone = dr.GetString(9),
});
}
return AllCustomers;
 }

Şimdi ise aynı işlemi Entity Framework kullanarak yapıyoruz,

NorthwindEntities db = newNorthwindEntities();
public List<Customers> GetCustomersBy_EF()
{
List<Customers> AllCustomers = newList<Customers>();
AllCustomers = db.Customers.ToList();
return AllCustomers;
 }

Bakıldığı zaman ADO.Net ile yaklaşık 25 satırda yaptığımız işlemi Entity Framework ile 7 satırda hallediyoruz. Şimdi gelelim Hız testimize. Bir adet WebForm ekliyoruz ve içerisine aşağıdaki kodları yazarak testimizi yapıyoruz.

 

İlk olarak ADO.Net hızını test ediyoruz,

Stopwatch sw2 = newStopwatch();
sw2.Start();
Customer c1 = newCustomer();
c1.GetCustomers_By_ADO();
sw2.Stop();
string result2 = sw2.ElapsedMilliseconds.ToString();
Response.Write(result2 + " ms.");

 

 Şimdi Entity Framework kullanarak testimizi yapalım,

Stopwatch sw1 = newStopwatch();
sw1.Start();
Customer c = newCustomer();
c.GetCustomersBy_EF();
sw1.Stop();
string result = sw1.ElapsedMilliseconds.ToString();
Response.Write(result);

 

Sonuçlar Nasıl Mı ?

 

Ado.Net ile yapılan işlem;

Entity Framework ile yapılan işlem;

 Görüldüğü üzre aradaki fark neredeyse 7 kattan daha fazla.Bunun nedenine gelecek olursak, ADO.Net ile yapılan her bir sorguda istenilen türdeki obje 1 defa generate edilirken Entity Framework ile yapılan her bir sorgu için entity'niz sürekli generate edilir ve bu projeniz için çok yüksek oranda bir performans kaybına neden olur. Bu fark küçük çaplı projelerde belki göz ardı edilebilir ancak eğer ki proje gayet kapsamlı ve büyük bir projeyse inanılmaz derecede bir hız farkı ortaya çıkarmaktadır.

 

Son söz olarak ; ADO Candır !!

11. IEEE Türkiye Öğrenci Kolları Ve Gold Kongresi - Kıbrıs'2013

Sağdan akan trafik, devasa büyüklükte DAU kampüsü, inanılmaz sıcaklık, mercedes taksiler ve yavru vatan kıprıs :)

Yaklaşık 2 ay önce davetini aldığımız 11. IEEE Türkiye Öğrenci Kolları Ve Gold Kongresine Üniversitemizde 10 yıldır faliyet gösteren IEEE Student Branch ekibinden 4 arkadaşla birlikte ve Üniversitemizden aldığımız her türlü maddi manevi destekle katılma fırsatımız oldu. Konferans salonları, konaklama, ulaşım, yemek vs. gibi bütün ihtiyaçlar Doğu Akdeniz Üniversitesi IEEE Student Branch ekibi tarafından organize edildi ve Türkiye'de bulunan çeşitli üniversitelerden katılan yaklaşık 200'e yakın öğrencileri en iyi ve güzel şekilde ağırladılar. Kadir Has Üniversitesi olarak kongre boyunca çeşitli oturumlar, workshop'lar, ve başta IEEE Türkiye temsilcisi olmak üzre birçok seçim ve oylamalara katıldık. Farklı üniversitelerden katılan birçok kişiyle tanışma fırsatımız oldu ve belkide bir daha hiç bozulmayacak arkadaş ilişkileri kurulmuş oldu. 

 

Malum Kıbrıs'ta olduğumuzdan havanın ne derece sıcak olacağını daha gitmeden önce tahmin etmiştik ama inanın ne tahmin etmişsek 2 katı çıktı. İnanılmaz bir sıcaklık vardı ve klima gördüğümüz anda sanki define bulmuş gibi sevinmiştik :)

Üniversite Gazimağusa daydı ve bizde DAU Yurt 4'de konakladık. Kampüs inanılmaz derecede büyük ve yürüyerek bir yere gidilmesi oldukça zordu bizde herkesin yaptığı gibi taksiyle her yere gidip geldik. Ücret olarak fena değil gibi 4-5 kişi bindiğinizde kişi başı max 3 TL gibi ücret ödüyorsunuz.Yemek konusu biraz sıkıntılıydı pek bizim alışık olduğumuz gibi değildi, deniz kum & güneş 3'ü 1 arada muhteşemdi :) Son gün Girne'ye gittik ve orada bulunan savaş zamanından kalma birkaç müzeyi gezdik,

 Ve daha nicesi..

Web Service'de Güvenlik | Soap Header

Bu makalede Web Service Nasıl Yazılır ? makalesinde bahsettiğim üzre Web Service'de Soap Header Kimlik Denetimi yani Username Password ile service'i kullanabilme konusundan bahsediyor olacağım.

 

Web Service'in tanımına değinecek olursa M2M iletişimin önünü açmak ve back-end sistemlerde var olan çeşitli database yada enterprise yapıların diğer platformlarla iletişimini güvenli bir şekilde sağlamak için geliştirilmiş yapılardır, Kısacası farklı platformların haberleşmelerini sağlamak için kullanılan teknolojilere verilen isimdir. Web Service Nasıl Yazılır ? makalesinde local'de bulunan Northwind database'ine bağlanarak Employees tablosundaki çalışanların bilgilerini getiren bir .asmx servis geliştirmiştik, hatırlicak olursanız projeyi kendi bilgisayarımızda çalıştırdığımızda aşağıdaki resimlerde olduğu gibi çok rahat bir şekilde metod isimlerine tıklayıp Çağır butonuna bastığımızda servis çalışıp istenilen verileri bize getiriyordu.

 

 Yukarıda da gördüğümüz gibi her şey sorunsuz çalışıyor ancak anormal olan durum service URL'ini bulan herhangi biri gidip aynı service'i kullanarak database'de kayıtlı bulunan verilere erişebilir ve bu durum hiç bir şirket yada service sahibi tarafında istenilen bir durum değildir.Güvenlik durumunda web service'ler için kullanılabilecek çeşitli yöntemler vardır bunlardan ençok tercih edileni kuşkusuz Soap Header'dır. Soap Header kullanarak service tarafında belirleyeceğimiz UserName ve Password ile Client'ın service'e bu UserName ve Password kullanarak girişine izin vereceğiz.

1.Adım | Proje ve Class'ın Oluşturulması

  • Visual Studio'da "Northwind" isminde bir adet ASP.Net Empty Web Application oluşturuyoruz. Sonrasında proje içerisine aşağıda olduğu gibi 1 adet User adında "SoapHeader"'dan kalıtım alan class oluşturuyoruz ve içerisine service'e login esnasında kullanacağımız attributeleri yazıyoruz.

   

 public class User : SoapHeader
    {
        public string Username;
        public string Password;
    }

 

2.Adım | Service Sayfasının ve WebMethod'un Oluşturulması

  • Bu adımda projemize sağ tıklayıp 1 adet "MyService" adında Web Service sayfası ekliyoruz ve içerisine aşağıda olduğu gibi kullanacağımız WebMethod'larını yazıyoruz

 

public User User;  //Oluşturmuş olduğumuz User class'ından 1 adet User tanımlıyoruz
 
[WebMethod]        
[SoapHeader("User")]  //Güvenlik burda devreye giriyor, WebMethod'a SoapHeader içerisinde bulunan User nesnesi ile giriş yapıldığını belirtiyoruz
public string KullanıcıGirisi()
{ 
   //Client tarafında UserName ve Password bilgileri doğru girildiğinde ve girilmediğinde yapılması gerekenleri belirtiyoruz
   if (User.Username == "caner" && User.Password == "tosuner")
      return "Kullanıcı Girişi Başarılı";
   else
      return "Kullanıcı Girişi Başarısız";
 }

 

 

Bütün bu işlemler sonrasında Projemizin Solution bölmümü sağ tarafta olduğu gibidir

 

 

 3.Adım | Client Tarafından Service'e İstekte Bulunulması

  • Solution'a sağ tıklayıp 1 adet "Client" adında ConsoleApplication oluşturuyoruz ve sonrasında solution'da bulunan iki projenin haberleşebilmesi için Client ta bulunan References'a sağ tıklayıp "Add Service Reference" diyoruz ve açılan penceren Discover'a tıklayıp solution'da bulunan Northwind projesini görmesini sağlayıp Service bir isim Verdikten sonra OK butonuna basıyoruz. Client'ta bulunan Program.cs class'ını açıp Main metodunun içerisini aşağıda olduğu gibi dolduruyoruz.

 

Northwind.ServiceReference1 sc = new Northwind.ServiceReference1 ();  //Referans olarak eklediğimiz service'in ismi
Northwind.User user= new Northwind.User ();   //Servis içerisinde bulunan SoapHeader'dan kalıtım almış nesnemizi seçiyoruz.
 
user.Username = "caner";   //Servis tarafında oluşturduğumuz Username ve Password bilgilerini user nesnesinin attributlerine yazıyoruz
user.Password = "tosuner";
 
string result= sc.KullanıcıGirisi(user);  //KullnıcıGirisi WebMethod'una user nesnesini veriyoruz ve return edilen sonucu ekranda yazıdırıyoruz.
Console.WriteLine(result);
 
Console.ReadKey();

 

Projeyi çalıştırdığımızda UserName ve Password bilgilerini doğru yazdığımızdan aşağıda olduğu gibi Kullanıcı Girişi Başarılı mesajını ekranda görmüş olacağız.

Microsoft Student Partner Programına Seçildim.

Microsoft'un öğrenciler için olan "Microsoft Student Partner" programına seçildim Smile

  

       "The Begining Of a Dream.." MSP programını ilk olarak geçen yıl önce bu zamanlar duymuştum ve o zaman tam olarak nedir ne değildir bilmiyordum, kısa bir araştırmanın ardından öğrenciler için kaçınılmaz bir fırsat olduğunu öğrendim ve koyuldum yollara :) Başvuru için neler gerekli ?, nasıl başvuru yapılır ? gibi soruların cevabını bulduktan sonra başvuru tarihini beklemeye koyuldum. Geçen yaz tatilinde Amerika'daydım ve sürekli olarak her hafta yaptığım şey Microsoft Kampüs Türkiye Facebook sayfasına girip başvurular başladı mı başlamadı mı diye kontrol etmekti. Aslında gitmeden önce her şeyi hazırlamıştım *Başvuru formunu doldururken gerekli bilgiler, referans olarak göstereceğim kişi hatta başvurular sırasında istenen tanıtım videosunun metnini bile yazmıştım ve Time Square' de  başvuru videosunu çekmiştim Cool Yani tek gereken şey başvurular açıldığında başvuru yapması kalmıştı.

Gel gelelim yaz sonuna kadar bir türlü başvurulara denk gelemedim ve Eylül ayının sonunda Türkiye'ye döndüm ve dersler başladıktan yaklaşık 2,5 ay sonra bir pazar akşamı misafirliğe gittiğim bir yerde gece saat 23:30 gibi facebook'da gezinirken Microsoft Kampüs Türkiye Facebook sayfasına girdim birde ne göreyim "Yeni Dönem MSP başvuruları için son 24 saat" yazıyordu ve 24 saatin dolmasına tam 30 dkka vardı.Hemen başvuru linkine tıklayıp formda bulunan 10-12 soruyu hızlıca doldurdum ve en çok korktuğum şey video konusunda herhangi bir şey istememeleriydi ve son olarak da başvurumdan üniversitede görevli olan bir hocamızın bilgisi olması şartıydı, hemen alelacele Taner hocaya e-mail atıp konu hakkında bilgilendirdim ve o da hemen cevap verip kendisinin ismini yazabileceğimi söyledi.

Neyse başvuruyu yapmıştım ve yaklaşık 1 ay içerisinde sonuçlar açıklandı ve o dönem yeni bir sisteme gidilerek ilk başvuran öğrencileri programa "Candidate" yani Aday olarak kabul etmişlerdi haliyle bende bir Microsoft Student Partner Candidate seçildim.Sonrasında çeşitli toplantılar ve etkinlikler düzenledik, çeşitli eğitimler Microsoft Office'de şahane etkinlikler ve birde Bilgi Üniv. Santral'de bir gece sabaha kadar Code-Night yapmıştık. Şahane bir duyguydu sabahlara kadar None-Stop coding :) MSP seçilebilmek için birçok şey yapmak gerekliydi, etkinliklere katılmak, uygulama geliştirmek kısacası tam anlamıyla Microsoft'un bizden beklediği "Aktif" olmaktı.Elimden geldiğince bütün etkinlikler eğitimlere katıldım çünkü MSP seçilemediğim taktirde bir daha bu tür ortamlarda bulunma ihtimalim de oldukça az olabilirdi.Neyse ki sonunda MSP başvuruları ile ilgili e-mail geldi ve aynı form'u yeniden doldurup programa başvurmamız istendi ve tabi birde video :/ Yaklaşık 30-40 denemenin sonucunda 2,5 dkkalık bir MSP başvuru videosu çektim ve link'ini Microsoft'a gönderdim.

         Geçen hafta 13 haziran Perşembe günü Mustafa Kasap hocamızdan aldığım mail ile MSP seçilmiştim. Aslında pekte şaşırmamıştım çünkü tam anlamıyla bir Candidate'dim Laughing yani normal şartlar altında seçilmem gerekir diye düşünüyordum ve çok şükür ki öyle de oldu Laughing 

Candidate'lik süresince neler yaptım, bana neler kattı ;

  • Birçok etkinliğe ve eğitime katıldım,
  • Microsoft Ofiste Tunus'tan gelen MSP arkadaşları misafir edip onlarla tanışma fırsatım oldu,
  • Şubat ayı içerisinde Microsoft Türkiye AçıkAkademi'nin düzenlediği Windows Phone Uygulama Geliştirme Yarışmasına katıldım ve 1 adet Nokia Lumia 800 Cep Telefonu kazandım,
  • Ee tabi telefonu aldıktan sonra bi gaza gelmeler oldu ve yaklaşık 2,5 ay içerisinde 15 adet Windows Phone uygulaması geliştirdim ve markete yolladım,
  • Geliştirdiğim uygulamalar sayesinde biraz tanınmış olacam ki şu anda Türkiye'de bulunan çeşitli firmaların IT çalışanlarından e-mailler almaya başladım ve Windows Phone ile ilgili sorularını yanıtladım,
  • Ben Candidate'ken MSP programında bulunan arkadaşların üzerinde çalıştığı bir proje vardı ve bir gece yarısı gelen email'de projede bir kişi eksik olduğu ve gönüllü katılacak bir kişi aradıkları yazıyordu, bende hiç tereddüt etmeden cvp yazdım ve yaklaşık 20-25 kişiyle birlikte bir Microsoft Projesinde görev alma şansım oldu.Proje hakkında pek bilgi veremiyorum çünkü henüz duyurulmuş bir şey değil :)
  • Biz öğrencilerin baş belası Cv'lerimizi doldururken içinde bu tarz şeylerin olması inanın hayatında şimdiye kadar çok sağlam 3 şirkette mülakata girmiş birisi olarak söylüyorum birçok şirket için büyük önem taşıyor ve firmaların dikkatini çekiyor,
  • Geliştirdiğim Windows Phone uygulamaları sayesinde, geçen yıl bu zamanlar "keşke bu şirkette çalışabilsem..." dediğim o şirket başta olmak üzere birkaç üst düzey firmadan iş teklifleri alma şansım oldu ama istenilen değilde istediğim yerde çalışmayı tercih ettiğimden şimdilik o teklifleri askıya aldım,
  • ve daha nicesi...

 

Kısacası MSP olmak ve bu community'nin içerisinde bulunmak harika bir deneyim oldu benim için ve olmaya da devam ediyor..

Web Service Nasıl Yazılır ?

Web Service günümüz teknolojilerinin olmazsa olmazları arasında yer almaktadır. Bunun en büyük nedeni M2M iletişimin önünü açmak ve back-end sistemde var olan çeşitli database yada enterprise yapıların diğer platformlarla iletişimini güvenli bir şekilde sağlamaktır.  

.Net tarafında çeşitli Web Service yazma yolları vardır bunlardan bir tanesi asmx dediğimiz [WebMethod]’ lar kullanılarak yazılan servislerdir. Aşağıda ki örnekte Database’den veri çekilerek nasıl bir asmx servis yazılıp çekilen veri internet ortamında yayınlanır ona değiniyor olacağız.

1.Adım | Projenin Oluşturulması

  • Öncelikle aşağıdaki resimde de olduğu gibi ismi "WebService" olan bir adet Asp.Net Empty Web Application oluşturuyoruz

2.Adım | Projeye Web Service Sayfası Eklenmesi

  • Projeyi oluşturduğumuzda içerisinde default olarak Properties, References ve Web.config sayfalar geliyor. WebMethod yazabilmek için Proje ismine sağ tıklayıp aşağıda ki resimde de olduğu gibi bir adet ismi "WebMethods" olan WebService sayfası ekliyoruz.

  3.Adım | WebMethod 'un Anlaşılması

  • Service sayfasını ekledikten sonra kodlarını açtığımızda içerisinde default olarak gelen bir adet HelloWorld() metodu bulunmaktadır
[WebMethod] // [WebMethod] tag'i altında yazılı olan Metodun bir "Web Method" olduğunu belirten yapıdır. Aslında kabacası bizim internette yayınlayacağımız ve Client tarafında kullanılacak metod olduğunu belirtiyor.
publicstring HelloWorld()  //Herbir .asmx service sayfasında Default olarak gelen parametre almadan geriye string dönen HelloWorld() bulunmaktadır.Browser'da servici çalıştırdığınızda aşağıda resimde olduğu gibi metodları görüyor olacaksınız
DipNot - [WebMethod] tanımlaması yapılan metodlar Browser'da görünmeyecektir, Sadece [WebMethod] etiketine sahip metodlar burda görünür ve Client tarafından direkt olarak kullanılır
{
return"Hello World";
}

4.Adım | Web Service Nasıl Bir İşlem Yapıyor Olacak ?

  • Geliştireceğimiz Web Service local'de bulunan Northwind Database'ine bağlanarak Employees tablosunda bulunan Çalışanların Ad(FirstName), Soyad(LastName) ve İş Tanımı(Title) bilgilerini yayınlıyor olacak.Bunun için öncelikle pc'nizde Northwind database'i bulunuyor olması gerekli. Olmayan arkadaşlar bu Link' teki script'i indirip MS-SQL Management Studio kullanarak kurulum yapabilirler.

5.Adım | Database'den Employees Bilgilerini Çeken Metodun Yazılması

  • Database ile bağlantı kurmanın çeşitli yolları vardır.İster Entity Framework kullanırsınız istersenizde klasik Ado.Net yazarsınız.Ben Ado.Net'in Entity Framework ve yandaşlarına kıyasla 7 kat gibi bir hız farkıyla çalışmasında dolayı Ado.Net kullanıyor olacağım Smile. İlk olarak "Employees" tablosundan "FirstName" ,"LastName" ve "Title" bilgilerini almamız için bu attributelere sahip "Employees" class'ını aşağıdaki gibi oluşturuyoruz
public class Employees
{
public string FirstName { get; set; }
public string LastName { get; set; }
public string Title { get; set; }
 }
  • Şimdi ise Ado.Net kullanarak çekeceğimiz bu Employees'leri List<Employees> array'i oluşturup içerisine atıp sonrasında Web Service' imiz ile yayınlıyor olacağız. Geriye List<Employees> dönen CallEmployees() adında bir metod tanımlayalım ve kodlarımızı aşağıda olduğu içerisine yazalım.
[WebMethod]
public List<Employees> CallEmployees()
{
//Employees'leri içerisine doldurup return ettireceğimiz List<> array
List<Employees> AllEmployees = new List<Employees>();
 
//Local'de bulunan Northwind database'ine bağlanmamızı sağlayan connectionstring'i
SqlConnection conn = new SqlConnection("server=.;database=Northwind;trusted_connection=True");
 
//Hangi bilgileri çekeceğimizi belirttiğimiz sql sorgumuz
SqlCommand cmd = new SqlCommand("select FirstName,LastName,Title from Employees", conn);
conn.Open(); //Sql bağlantısını açıyoruz
SqlDataReader dr = cmd.ExecuteReader();  //DataReader kullanarak verileri alıyoruz
while (dr.Read())
{
//Çektiğimiz verileri Employee nesnesi'nin attribütlerine atayıp sonrasında AllEmployees array'inin içerisine atıyoruz
AllEmployees.Add(new Employees()
{
FirstName = dr.GetString(0),
LastName = dr.GetString(1),
Title = dr.GetString(2)
});
}
//Son olarakda doldurduğumuz array'i return ediyoruz
return AllEmployees;
}
  • Projeyi Run ettiğimizde Browser'da aşağıda olduğu gibi HelloWorld() metoduyla birlikte bizim sonradan tanımladığımız CallEmployees() metodunu görüyor olacağız. 1. resimde bulunan metodumuza tıkladığımızda 2. resimde gördüğümüz sayfa açılıyor olacak ve Çağır butonuna tıkladığımızda son resimde gördüğümüz gibi Database'den gelen veriler XML formatında görüntüleniyor olacak.

 -

 6.Adım | Web Service'in Internet'te Yayınlanması

  • Geliştirmiş olduğunuz bu gibi Web Servic'i yayınlamak için Solution'dan proje üzerine sağ tıklayıp Publish deyip sonrasında generate edilmiş dosyaları web sitenizin bulunduğu ftp' ye atmanız yeterli olacaktır.
  • Yazılmış olan bu web service'i diğer projelerde kullanmak için ise service'in bulunduğu sayfayı projelerinize Reference olarak ekleyip sonrasında içerisinde bulunan metodları kullanabilirsiniz.Biz projede sadece select işlemi yapan bir WebMethod yazdık ama ihtiyaca göre çok daha farklı inserti, update, delete gibi işlemler yapan WebMethod'larda yazılabilir.

 7.Adım | Web Service' de Güvenlik

  • Makalenin başında da bahsettiğimiz gibi Web Service'ler şirketler için büyük önem taşırlar nedeni ise veri'nin sadece istenilen kişiler tarafından kullanılması. Biz yukarıda geliştirmiş olduğumuz projede güvenlik olarak hiç birşey yapmadık yani siz bu projeyi internette publish ettikten sonra çeşitli yazılımlar kullanılarak data-sniffing ile servis'in bulunduğu URL bulunup yazmış olduğunuz metodlar diğer kişiler tarafındanda kullanılabilir.İşte bu gibi durumlarda güvenlik çok büyük öneme sahip oluyor.Konu uzun olduğu için Web Service'de Güvenlik Nasıl Sağlanır ? bir sonraki makalemizde görüyor olacağız. Umarım buraya kadar yazdıklarımız yararlı olmuştur, herhangi bir sorunuz olduğunda e-mail ile ulaşabilirsiniz,

 

Projeyi burdan indirebilirsiniz..

Windows Phone Facebook'a Paylaşım Yapma

1.Adım | Visual Studio Projesi Oluşturulması

  • İlk olarak ismi TestApp olan bir adet Windows Phone Projesi oluşturuyoruz

 2.Adım | Design Sayfasının Hazırlanması

  • Uygulama ekranında bir adet TextBox, bir adette Button ve bir adette WebBrowser Kontrolleri olacak, gerekli kontroller eklediğinde en dışta bulunan Grid Design Kodları aşağıda olduğu şekildedir;

    

<Grid x:Name="LayoutRoot" Background="Transparent">
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>
        <StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12,17,0,28">
            <TextBlock Text="Caner Tosuner" Style="{StaticResource PhoneTextNormalStyle}" Margin="12,0"/>
            <TextBlock Text="Facebook" Margin="9,-7,0,0" Style="{StaticResource PhoneTextTitle1Style}"/>
        </StackPanel>
        <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
            <Grid.RowDefinitions>
                <RowDefinition Height="auto"/>
                <RowDefinition Height="auto"/>
            </Grid.RowDefinitions>
            <TextBox Grid.Row="0" Height="150" Name="Message"/>
            <Button Grid.Row="1" Content="Post" Click="Button_Click"/>
        </Grid>
        <phone:WebBrowser Name="Browser" Grid.Row="1" Background="Aqua" Width="450" Height="600" Visibility="Collapsed" Navigated="Browser_Navigated"/>
    </Grid>

 

  • Bu işlemler sonucunda UI aşağıdaki gibi görünecektir.

3.Adım | Facebook AppID Oluşturma

  • Uygulamada Facebook'un geliştirmiş olduğu SDK'yı kullanacağımızdan Facebook bilgilerini kullanacak uygulamayı sistemine kaydetmeyi ve belirli izinler doğrultusunda SDK'yı kullanma izni vermektedir. Bunun için https://developers.facebook.com/apps adresine giderek aşağıda olduğu gibi uygulama oluşturup sonrasında Facebook'un bize vereceği AppID'yi alıp kullanacağız.

     

4.Adım | Facebook SDK'nın Projeye Eklenmesi

  • Facebook'un geliştirmiş olduğu kütüphaneyi uygulamamıza eklemek için Nuget'ı kullanıcaz.Bunun için Visual Studio'dan Tools -> Library Package Manager -> Package Manager Console tıklayıp altta açılan sayfaya  PM> Install-Package Facebook yazıyoruz ve kütüphanenin kurulmasını bekliyoruz. Kurulum tamamlandıktan projemizin References bölümüne aşağıda olduğu gibi Facebook'un eklendiğini görüyor olacaksınız.

5.Adım | FacebookClient Oluşturulup AppID Değerinin Kullanılması

  • FacebookClient nesnesi bizim Facebook API'ları ile connection'ı kurup bütün veri alış verişini sağlayacak olan yapıdır. Facebook'ta yeni uygulama oluştururken bize verilen AppID/App Key kodunu aşağıda AppID değişkenine atıyoruz ve Facebook böylece hangi uygulamanın API'larını kullandığı gibi bilgilere ulaşmış oluyor.
private const string AppID = "Facebok App ID";
private FacebookClient client;
// Constructor
public MainPage()
{
InitializeComponent();
client = new FacebookClient();
 }

6.Adım | Post Buton'u Click Event'i

  • Uygulamadaki senaryo şu şekilde işliyor olacak; TextBlock'a girilen string Post butonuna tıklandığı anda SDK'yı kullanarak Facebook'a bağlanıp kullanıcı adı ve şifre bilgileri doğru girildiğinde bize authentication verecek ve sonrasında paylaşım yapmamızı sağlayacak. Aşağıda Post butonuna tıklandığında çalışacak olan kodlar bulunmaktadır.
private void Button_Click(object sender, RoutedEventArgs e)
{
//API' ile birlikte gönderilecek olan parametreler
var parameters = newDictionary<string, object>();
parameters["client_id"] = AppID;
parameters["redirect_uri"] = "https://www.facebook.com/connect/login_success.html";
parameters["response_type"] = "token";
parameters["display"] = "touch";
 
parameters["scope"] = "publish_stream";
Browser.Visibility = System.Windows.Visibility.Visible;
Browser.Navigate(client.GetLoginUrl(parameters));
}

Bütün bu işlemleri hatasız bir şekilde yapıp uygulamamızı çalıştırdığımızda aşağıdaki gibi bir görüntü alıyor olacağız.

7.Adım | Browser Navigation Event'i

  • Kullanıcı UserName ve Password bilgilerini girip giriş yaptıktan sonra Browser, bizim access token'ımızın yani doğru bir şekilde giriş yaptığımıza dair gerekii bilgiyi API'ları çağırmak için bir URL'e navigate edilecek. Browser'ın Navigated Event'i aşağıdaki gibi olacak.
private void Browser_Navigated(object sender, NavigationEventArgs e)
{
FacebookOAuthResult oauthResult;
//URL'in erişim izni olduğunu kontrol ediyoruz
if (!client.TryParseOAuthCallbackUrl(e.Uri, out oauthResult))
{
return;
}
//Checking that the user successfully accepted our app, otherwise just show the error
if (oauthResult.IsSuccess)
{
client.AccessToken = oauthResult.AccessToken;
 
Browser.Visibility = System.Windows.Visibility.Collapsed;
DuvaraGonder();
}
else
{
MessageBox.Show(oauthResult.ErrorDescription);
Browser.Visibility = System.Windows.Visibility.Collapsed;
}
}

8.Adım | DuvaraGonder() Metodu

  • Bütün bu işlemleri yaptıktan sonra artık başarılı bir şekilde Facebook'a giriş yaptık ve gerekli izinleri aldık bundan sonra yapmamız gereken şey TextBox'dan girilen değeri DuvaraGonder() metodunu kullanarak Timeline Duvarımıza göndermek.
private void DuvaraGonder()
{
var parameters = new Dictionary<string, object>();
parameters["message"] = Message.Text;
client.PostAsync("me/feed", parameters);
}

9.Adım | PostCompleted() Metodu

  • Kullanıcı Post butonuna tıkladıktan sonra göndermiş olduğumuz mesajın başarılı bir şekilde gidip gitmediğini öğrenmek için PostCompleted() metodundan yararlanabiliriz. Gerekli kodları constructor'ın içerisinde EventHandler'ın içerisine ekliyor olacağız.
// Constructor
public MainPage()
{
InitializeComponent();
client = new FacebookClient();
client.PostCompleted += (o, args) =>
{
//Hata Kontrolünün yapıldığı bölüm
if (args.Error != null)
{
Dispatcher.BeginInvoke(() => MessageBox.Show(args.Error.Message));
}
else
{
Dispatcher.BeginInvoke(() => MessageBox.Show("Mesaj başarılı bir şekilde gönderildi"));
}
};
}

10.Adım | Proje Test İşlemi

  • Buraya kadar yazmış olduğumuz kodlar sayesinde artık Facebook'a giriş yapıp TextBlock içerisine yazılan metni Post butonuna tıklandığında Facebook sayfamıza gönderiyor olacağız. Bir üstte yazdığımız 9.Adım'da göndermiş olduğumuz metnin Gidip Gitmediği hakkında bilgide alabiliyoruz. Uygulamayı çalıştırdığımızda ekran görüntüsü aşağıdaki gibi olacaktır.

                                               

11.Adım | Access Token'ın IsolatedStorage ile Kaydedilmesi

  • Kullanıcının uygulamayı kullanıp her Facebook Share işleminde UserName ve Password bilgilerini girmesi hiç istenen birşey değildir. Bizde bunun için Access Token bilgisini IsolatedStorage ile uygulama içerisine kaydedecez.Bunun için SaveAccessToken() adında bir metod yazıcaz.
private void SaveAccessToken(String token)
{
if (!IsolatedStorageSettings.ApplicationSettings.Contains("token"))
IsolatedStorageSettings.ApplicationSettings.Add("token", token);
else
IsolatedStorageSettings.ApplicationSettings["token"] = token;
IsolatedStorageSettings.ApplicationSettings.Save();
}

12.Adım | Access Token'ın IsolatedStorage'dan Okunması

  • Uygulama içerisine kaydettiğimiz Access Token bilgisini kullanıcı paylaşım yapmak istediğinde tekrardan IsolatedStorage'dan okuyor olmamız gerekiyor.Aşağıda bu işlemi yapan GetAccessToken() metodumuzun kodları bulunmaktadır.
private string GetAccessToken()
{
if (!IsolatedStorageSettings.ApplicationSettings.Contains("token"))
return null;
else
return IsolatedStorageSettings.ApplicationSettings["token"] as string;
 }

13.Adım | Uygulama Açıldığında Access Token'ın Kontrol Edilmesi

  • Gerekli metodları yazdıktan sonra uygulama açılış anında ya da her nerde gereki ise AccessToken var mı ? yok mu ? kontrol etmemiz gerekmektedir.Bunuda aşağıda olduğu gibi yapıyoruz.
//AccessToken var mı yok mu kontrolü
if (GetAccessToken() != null)
client.AccessToken = GetAccessToken();

  14.Adım | Expire Olan Token'ın Kontrol Edilmesi

  • PostCompleted handler'ı içerisinde bu kontrolü yapmamız gerekiyor ve kodlar aşağıda olduğu gibi Contructor'ın içerisinde yazıyoruz.
client.PostCompleted += (o, args) =>
{
//Hata Kontrolünün yapıldığı bölüm
if (args.Error != null)
{
//Yetki Hatası
if (args.Error is FacebookOAuthException)
{
Dispatcher.BeginInvoke(() => MessageBox.Show("Yetki Hatası"));
//Hata oluştuğundan dolayı Saved Token'ı uçuruyoruz
SaveAccessToken(null);
client.AccessToken = null;
}
else
Dispatcher.BeginInvoke(() => MessageBox.Show(args.Error.Message));
}
else
   Dispatcher.BeginInvoke(() => MessageBox.Show("Mesaj başarılı bir şekilde gönderildi"));

};

15.Adım | Back Buton'nuna Tıklanılması

protected override void OnBackKeyPress(System.ComponentModel.CancelEventArgs e)
{
//Browser görünüyor ise gizle ve navigation event'i iptal et
if (Browser.Visibility == System.Windows.Visibility.Visible)
{
Browser.Visibility = System.Windows.Visibility.Collapsed;
e.Cancel = true;
}
base.OnBackKeyPress(e);
}

16.Adım | Haydi Test Edelim :)

Windows Phone'da Web Service Kullanımı

Mobil tarafta uygulama geliştiriyorsanız Web Service’den kaçışınız imkansızdır. Çünkü database’ler ile mobil uygulama arasındaki iletişimi sağlayacak hizmet Web Service tir ve mobil uygulama aktarılacak olan veri XML yada JSON tipinde yayınlamaktadır. Bu makalede IMKB’den aldığı sonuclarla anlık Döviz Verilerini paylaşan bir XML Web Service’den gelen verileri alıp Parse işlemi yapıp daha sonrasında WP uygulamamızda gösteriyor olacağız.

 

Öncelikle ilk olarak Visual Studio’yu açıp 1 adet adı XML_Parse olan Windows Phone Pivot App Projesi oluşturalım.

 

Design sayfasında Default olarak gelen xaml kodlarını tamamiyle temizleyelim. Bunun için En dıştaki Grid içerisinde bulunan kodları silmek işimizi görecektir. Grid içerisindeki kodları sildiğimizde son hali aşağıda olduğu gibidir.

    

<!--LayoutRoot is the root grid where all page content is placed-->
    <Grid x:Name="LayoutRoot" Background="Transparent">
                  //Bu bölümdeki kodları temizledik
    </Grid>

 

 Bir sonraki işlem olarak Design sayfasını istediğimiz şekilde düzenleyelim. Görünüm olarak daha güzel görüneceğini düşündüğümden WrapPanel kullanmayı tercih ettim.WrapPanel sayesinde uygulama ekranına dinamik olarak yerleşecek Buton’lar Panorama Page gibi geliştirilmiş uygulama havası katacaktır. WrapPanel kullanmak için ilk olarak bir dll’i projenize referans vermeniz gerekiyor. http://silverlight.codeplex.com/downloads/get/270984 sitesinden Silverlight Toolkit kurup daha sonrasında aşağıda olduğu gibi Solution Explorer’da projeniz içerisinde bulunan References’a sağ tıklayıp Add Reference diyip aşağıda dosya yolunda bulunan dll’i projenize referans olarak ekliyorsunuz.

For 32-bit systems:

C:\Program Files\Microsoft SDKs\Windows Phone\v7.1\Toolkit\Aug11\Bin\Microsoft.Phone.Controls.Toolkit.dll

For 64-bit systems:

C:\Program Files (x86)\Microsoft SDKs\Windows Phone\v7.1\Toolkit\Aug11\Bin\Microsoft.Phone.Controls.Toolkit.dll

Referansı ekledikten sonra uygulamamızın design sayfasına da aşağıda bulunan kod’u yazıyoruz.

 

xmlns:toolkit="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone.Controls.Toolkit"

Şimdi xaml kodlarını yazmaya başlayabiliriz. Design tarafında kullanacağımız kontrollerin kodları aşağıdaki gibi olacaktır.

       

<Grid.Background>
        <!--Pivot Control-->
        <controls:Pivot x:Name="dovizpivot">
            <!--Pivot item one-->
            <controls:PivotItem Header="Döviz Verileri">
                <ListBox x:Name="lbdovizler" ScrollViewer.VerticalScrollBarVisibility="Disabled" VerticalAlignment="Stretch" HorizontalAlignment="Stretch">
                    <ListBox.ItemsPanel>
                        <ItemsPanelTemplate>
                            <toolkit:WrapPanel></toolkit:WrapPanel>
                        </ItemsPanelTemplate>
                    </ListBox.ItemsPanel>
                    <ListBox.ItemTemplate>
                        <DataTemplate>
                            <StackPanel>
                                <Button x:Name="btndoviz" Content="{Binding ADI}" FontSize="32" Background="#0076dd" FontWeight="Bold" Foreground="White" Height="120" Width="150">
                                </Button>
                            </StackPanel>
                        </DataTemplate>
                    </ListBox.ItemTemplate>
                </ListBox>
            </controls:PivotItem>

 

Senaryo şu şekilde işliyor, Xml olarak gelen verileri Parse edip bir array’in içerisine atacaz ve o array’ide üstte yazdığımız lbdovizler lsitbox’ına ItemsSource olarak verecez. Sonrasında listbox’ın ItemTemplate’inde bulunan Buton’un Content’ine Bind olarak oluşturacağımız object’in ADI attribute’ünü verdiğimizden o Döviz’in ismi ekranda görünecektir.

 Şimdi ise CodeBehind’a geçelim..

Gelen Veriyi Dovizler adında class oluşturarak ona atayacağız, class aşağıdaki şekilde olacaktır.

   

//Service’in sunduğu Xml formatı aşağıdaki gibi.Bize DOVIZ türünde ADI,ALIS,SATIS attributleri olan altinkaynak adında array dönüyor

 public class Dovizler
    {
        public string ADI { get; set; }
        public string ALIS { get; set; }
        public string SATIS { get; set; }
    }

//Dovizleri saklayacağımız List array’i tanımladık.

        List<Dovizler> Dovizler = newList<Dovizler>();
        public MainPage()
        {
            InitializeComponent();
            GetResult();  //GetResult Metodunu çağırıyoruz
        }
//GetResult Metodu bize Web Service’in bulundu adrese giderek orda XML olarak yayınlanmış verileri getirecektir.
        publicvoid GetResult()
        {
            WebClient wc = newWebClient();
            wc.DownloadStringCompleted += wc_DownloadStringCompleted;
            wc.DownloadStringAsync(newUri("http://xml.altinkaynak.com.tr/doviz.xml")); //Service URL’i
        }

 

void wc_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
        {
            if (e.Error != null)// Eğer hata mesajı döner ise metod’dan çıkıyoruz
                return;
            try
            {
                XElement xel = XElement.Parse(e.Result);  //gelen veriyi xel’e atıyoruz ve sonrasında nesne haline getirerek array’in içerisine insert ediyoruz
                 Dovizler = from dv in xel.Elements("DOVIZ") //Doviz nesnesine gitmesini söyledik
                           selectnewDovizler()
                           {
    //Doviz nesnesinin hangi attributlerini alacağımızı belirtiyoruz
                               ADI = dv.Element("ADI").Value,
                               ALIS = dv.Element("ALIS").Value,
                               SATIS = dv.Element("SATIS").Value
                           };
                // Son olarak Array’i lbdovizler ListBox’ına ItemsSource olarak veriyoruz
                lbdovizler.ItemsSource = Dovizler;
            }
            catch (Exception)
            {
                MessageBox.Show("Lütfen Daha Sonra Tekrar Deneyin.", "Bilgilendirme", MessageBoxButton.OK);
                return;
            }
        }

Uygulamanın ekran görüntüsü aşağıda olduğu gibidir.

Isolated Storage Kullanımı

Windows Phone' uygulama içerisinde veri saklamak için kullanabileceğimiz çeşitli yapılar vardır. Bunlardan birtanesi IsolatedStorage'dır. IsolatedStorage kullanarak uygulamanın kullanıcı tarafından değiştirilmiş ayarlarını, yada uygulamada UserName Password gibi bilgiler gerekli ise bu bilgileri uygulama her açıldığında sürekli kullanıcıya sormak yerine ilk seferde kullanıcıdan bu bilgileri alıp IsolatedStorage içerisine kolayca kaydedebiliriz.

IsolatedStorage Veri Yazma

private void DosyayaYaz(string text)
{
IsolatedStorageFile storage= IsolatedStorageFile .GetUserStoreForApplication();
IsolatedStorageFileStream fs =storage.CreateFile("data.txt");
StreamWritersw =newStreamWriter(fs);
sw.Write(text); //Metoda gelen text değişkeni içerisindeki değer IsolatedStorage ile data.txt dosyası içerisine kaydedilir
sw.Close();
}

 

IsolatedStorage Veri Okuma

private string DosyadanOku()
{
IsolatedStorageFilestorage= IsolatedStorageFile.GetUserStoreForApplication();
if (storage.FileExists("data.txt"))  //daha öncesinde oluşturduğumuz data.txt adlı dosya varmı diyee kontrol ediyoruz
{
IsolatedStorageFileStream fs = storage.OpenFile("data.txt", System.IO.FileMode.Open, System.IO.FileAccess.Read);
StreamReader sr=new StreamReader(fs);
string kayitliVeri = sr.ReadToEnd();
sr.Close();
}
else
{
return String.Empty; //eğer o isimde bir dosya yok ise boş değer döndürüyoruz
}
return kayitliVeri ;
}

IsolatedStorage Veri Silme

private void DosyaSil()
{
IsolatedStorageFile storage= IsolatedStorageFile.GetUserStoreForApplication();
if(storage.FileExists("data.txt"))
     storage.DeleteFile("data.txt");
else
   return ;
}

>> catch {Foot in Mouth} 'e düşmemeniz dileğiyle.. Smile <<

 

Log4Net Database Logx

Log4Net .net uygulamaları için geliştirilmiş olan açık kaynak kodlu bir log’ lama kütüphanesi ve Java’da bulunan loglama aracı Log4J'nin .NET uyarlamasıdır.

 

Log Seviyeleri

ALL : Tüm mesajların loglandığı seviyedir.

DEBUG : Developement aşamasına yönelik loglama seviyesidir.

INFO : Uygulama içerisindeki bilgileri loglayabildiğiniz seviyedir.

WARN : Hata olmayan fakat önemli bir durumun oluştuğunu belirtebileceğimiz seviye.

ERROR : Hata durumunu belirten seviye. Sistem hala çalışır haldedir.

FATAL : Uygulamanın sonlanacağını, faaliyet gösteremeyeceğini belirten mesajlar için kullanılacak seviyedir.

OFF : Hiç bir mesajın loglanmadığı seviyedir.

 

Log’lanacak bilgiler file system tarafında ya da database’de kaydedilebilmektedir.

DBLog adında bir database oluşturalım ve Log kayıtlarını tutacağımız Log adında aşağıda olduğu gibi bir tablo yaratalım

CREATE TABLE [dbo].[Log] (
    [Id] [int] IDENTITY (1, 1) NOT NULL,
    [Date] [datetime] NOT NULL,
    [Thread] [varchar] (255) NOT NULL,
    [Level] [varchar] (50) NOT NULL,
    [Logger] [varchar] (255) NOT NULL,
    [Message] [varchar] (4000) NOT NULL,
    [Exception] [varchar] (2000) NULL
)

 

Uygulama içerisinde App.cofig ya da Web.config sayfalarının içerişini aşağıda olduğu gibi yapıp sadece connectionstring’ini değiştirmeniz yeterli olacaktır.

<?xmlversion="1.0"encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="log4net"type="log4net.Config.Log4NetConfigurationSectionHandler,
Log4net"/>
  </configSections>
  <log4net>
    <root>
      <levelvalue="DEBUG" />
      <appender-refref="ADONetAppender" />
    </root>
    <appendername="ADONetAppender"type="log4net.Appender.ADONetAppender">
      <bufferSizevalue="100" />
      <connectionTypevalue="System.Data.SqlClient.SqlConnection, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
      <connectionStringvalue="server=serveradi; database=databaseadi;trusted_connection=true;" />
      <commandTextvalue="INSERT INTO Log ([Date],[Thread],[Level],[Logger],[Message],[Exception]) VALUES (@log_date, @thread, @log_level, @logger, @message, @exception)" />
      <parameter>
        <parameterNamevalue="@log_date"/>
        <dbTypevalue="DateTime"/>
        <layouttype="log4net.Layout.RawTimeStampLayout"/>
      </parameter>
      <parameter>
        <parameterNamevalue="@thread"/>
        <dbTypevalue="String"/>
        <sizevalue="255"/>
        <layouttype="log4net.Layout.PatternLayout">
          <conversionPatternvalue="%thread"/>
        </layout>
      </parameter>
      <parameter>
        <parameterNamevalue="@log_level"/>
        <dbTypevalue="String"/>
        <sizevalue="50"/>
        <layouttype="log4net.Layout.PatternLayout">
          <conversionPatternvalue="%level"/>
        </layout>
      </parameter>
      <parameter>
        <parameterNamevalue="@logger"/>
        <dbTypevalue="String"/>
        <sizevalue="255"/>
        <layouttype="log4net.Layout.PatternLayout">
          <conversionPatternvalue="%logger"/>
        </layout>
      </parameter>
      <parameter>
        <parameterNamevalue="@message"/>
        <dbTypevalue="String"/>
        <sizevalue="4000"/>
        <layouttype="log4net.Layout.PatternLayout">
          <conversionPatternvalue="%message"/>
        </layout>
      </parameter>
      <parameter>
        <parameterNamevalue="@exception"/>
        <dbTypevalue="String"/>
        <sizevalue="2000"/>
        <layouttype="log4net.Layout.ExceptionLayout"/>
      </parameter>
    </appender>
  </log4net>
</configuration>

CodeBehind tarafında ki kodlar ise şu şekilde olacaktır

private static readonly log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.
MethodBase.GetCurrentMethod().DeclaringType);
        private void button1_Click(object sender, EventArgs e)
        {
            log4net.Config.XmlConfigurator.Configure();
            log.Debug("log Debug");
            log.Info("log Info");
            log.Warn("log Warn");
            log.Error("log Error");
            log.Fatal("log Fatal");
        }

  

Bu işlemler sonrasında database’de ki tabloya kayıtlar insert olmuş olacaktır.

 

Android'den fazla C# kodu yazılan Google Hackathon'u :)

     ODTÜ Teknokent, Google Türkiye ve Amerika Birleşik Devletleri Büyükelçiliği iş birliği ile 16-17 Mayıs 2013 tarihinde Orta Doğu Teknik Üniversitesi’nde gerçekleşen “Social Entrepreneurship Hackathon” adlı yarışmaya Kadir Has Üniversitesi'ni temsilen 5 arkadaş katıldık.

         Aslında üniversitede ki hocam Selçuk Öğrenci bana ilk "Android hackathon var gitmek ister misin ?" diye sorduğunda ilk başta "tabi hocam hemen giderim, nerede ne zaman ?.. " gibi konuştuktan sonra kendi kendime bi sordum "Caner hayırdır ?.. Markette 16 tane uygulamam ver derken bu android market değil Windows Phone abicim..." falan filan derken bu düşüncemi sonrasında Selçuk hocamla da paylaştım ama o yinede benden katılmamı ve şakayla karışık takımın "Core" denen şeysi olmamı söyledi :)

Bende emir büyük yerden deyip tamam hocam elimden gelen neyse üstüne dahasını katarak arkadaşlara yardım edeceğimi söyledim. Neyse 15 Mayıs günü yola çıktık ve yaklaşık 6-7 saat içerisinde gece 23:15 gibi Ankara'ya vardık. Ankara dışından gelen öğrenciler TEDAS Misafirhanesi'nde konaklayacak diye söylemişlerdi bizde geceyi orada geçirdik.Sabah ODTU Kültür Merkezine geçtik ve orada açılış konuşmasının olacağı salona gittik. Google Türkiye ekibinden, ODTU Teknopark ekibinden, ABD Büyük elçiliğinden ve Teknoloji bakanlığından gelen konuşmacıları dinledikten sonra 2-3 saatlik bir ara verdik ve sonradan 22 saat sürecek olan non-stop coding yani Hackathon başladı. Arkadaşlarla geliştirmeye karar verdiğimiz uygulamanın adı "EBS" Engelli Bildiri Sistemi'ydi. Ne yapacaktı EBS ; aslında içinde biraz Twitter biraz Instagram olan bir uygulama gibi düşünebiliriz.

        Engelli vatandaşlara hizmet verecek olan uygulamanın ana işlevi şu şekilde olacak; diyelim ki engelli bir   vatandaşımız sokakta yolda giderken kendisine engel teşkil eden bir durumla karşılaştığında uygulamasını açıp lokasyon bilgisine göre bulunduğu yerin Belediyesi'ne Fotograf, Açıklama, Yer Bilgilerini göndererek engel hakkında bildiri/şikayet yapabiliyor olacaktı. Sağtarafta bulunan fotoğrafı uzun bir süre önce internette görmüştüm örnek olacağını düşünerek paylaşmak istedim. Bu vatandaşımızı örnek alacak olduğumuzda ;

        Engelli vatandaş bu karşılaştığı engel karşısında uygulamasını açıp sorumlu belediyeye sorunun fotoğrafını çekip, açıklamasını yazıp gönder butonuna basacak ve bu bildiri Belediye nin sahip olduğu Web arayüzüne düşüp görüntülenecek Belediye tarafından görüntülenecek ve sorun giderildiğinde o şikayeti yapan vatandaş mail yoluyla "Sorun giderilmiştir" şeklinde bilgilendirilecek.

    Aslında fikir bence gayet güzeldi çünkü etkinliğin adı Sosyal Girişimcilik olduğundan uygulamanın içeriği hem Sosyal olmalıydı ve toplumsal bir soruna parmak basıyor olması gerekiyordu. 

Yazılımsal olarak neler gerekli diye düşündüğümüzde ;

  1. Öncelikle Server'da tutulan Sağlam bir Database 
  2. Mobil uygulama ile iletişimi sağlayıp bütün ihtiyaçlara cevap verecek iyi bir WebService,
  3. Belediyeler tarafında gelen bildirimleri görüntülemek için kullanılacak fonksiyonel bir Web Sayfası.
  4. Ve tabi son olarak da Android uygulaması :)

        1, 2 ve 3. şıklar benim yapacağım konulardı. İlk olarak MS-SQL kullanarak kullanışlı bir Database geliştirdim ve bu Database'i Azure Cloud servisimde sakladım. Sonrasında WCF kullanarak json formatında yayın yapan bir adet Web Service geliştirdim. En son olarak da ASP.Net kullanarak belediyeler için bir adet Web Sayfası geliştirdim. Şaka gibi ama bütün bunlar 6 saat içerisinde bitmişti Hackathon bu olsa gerek Smile.

Android uygulaması üzerinde çalışan arkadaşlar o sırada geliştirmeye devam ediyorlardı. 22 saatin sonunda maalesef arkadaşlar Android uygulamasını tam istediğimiz haliyle yetiştiremediler Frown Sunumumuzu yaptık ve sıralamaların açıklanmamıştı ve birincide olamamıştık.

Aslında bi ara şey diye düşünmedim değil; "Acaba çok mu fazla Microsoft'u işin içerisine soktum ?.." çünkü baktığımızda üstte saydığım gibi yazılımsal olarak 4 adet görev yada geliştirilecek yapı vardı ve bunlardan 3 tanesinde tamamiyle Microsoft'un izi vardı, MS-SQL Database, WCF WebService ve Asp.Net Web Sayfası :) Etkinlik sonunda arkadaşlarla oturup bi baktığımızda şaka maka Android kodundan fazla C# vardı işin içerisinde Cool 

Ama her şeye rağmen gayet güzel ve eğlenceli bir hackathon oldu, kişisel deneyim olarak bir çok şey kazandım gibi zira önümüzdeki sene Microsoft'un her yıl düzenlediği Imagine Cup yarışmasına katılmayı düşünüyordum ve bu deneyim benim için gerek sunum noktasında, gerek takım olarak çalışabilme konusunda gerekse işin sosyallik kısmında son derece katkıları oldu diye düşünüyorum. Umarım Selçuk hoca bize ilerleyen zamanlarda da bu tür görevler paslar ve bizde okulumuzu (1. olamazsakda) en iyi şekilde temsil etmeye çalışırız Laughing