30.5.09

Yeşil Dalga Trafik Kontrol Sisteminin Veri Tabanında Saklanması ve Hesaplanması

Yeşil dalga sistemi:

- trafiğin daha hızlı akması
- yakıt tasarrufu
- çevre temizliği

ana nedenleri ile uygulanır. Bir anayoldaki araçların belirli olan yeşil dalga hızı ile ilerlemeleri halinde ilk ışık haricinde kırmızı ışığa yakalanmazlar. Böylece yukarı da bahsettiğimiz amaçları sağlamış oluruz.

Ben proje arkadaşlarım (Gamze Çukurluöz ,Metin Memişoğlu , Alperen Demirel) yeşil dalga sistemininin herhangi bir yolda uygulanabilmesi için bir veritabanı ve arayüz programı tasarladık.

Veritabanımızda şehir , cadde , yol ,kavşak ve ışık tabloları bulunmaktadır. Tüm bu tabloları c# da hazırladığımız arayüz programımızla stored procedureler yardımı ile alıp saklarken , aynı şekilde hesap için kullabilmek için verebiliyoruz. Veritabanımızda ayrıca trigger ve constraint örnekleri bulunmaktadır.

Kavşakların koordinatlarını google earthden derece şeklinde alarak kaydettik. İki kavşak arası mesafeyi hesaplarken ise özel bir fonksiyon kullandık. Kod aşağıdaki gibidir.

public static class GeoDistance{

public static double Calculate(double startLat, double startLong, double endLat, double endLong)
{
return 6371.0 * Math.Acos(
Math.Sin(DegreeToRadian(startLat)) *
Math.Sin(DegreeToRadian(endLat)) +
Math.Cos(DegreeToRadian(startLat)) *
Math.Cos(DegreeToRadian(endLat)) *
Math.Cos(DegreeToRadian(endLong - startLong))
);
}
private static double DegreeToRadian(double degreeValue)
{
return (degreeValue * Math.PI / 180.0);
}

private static double RadianToDegree(double radianValue)
{
return (radianValue / Math.PI * 180.0);
}

Bu method kilometre dönürmektedir. 4 tane parametre almaktadır. Bunlar iki noktanın enlem ve boylamlarının google earthden aldığımız derece değeridir.

Yeşil dalga problenin asıl çözümü yeşil ışıkların referans noktasına göre (ilk ışığa) yeşil yanmaya başlama sürelerini hesaplamaktır. Bu ise başlangıç sıfır alındıktan sonra aradaki mesafenin hıza bölünmesi ile hesaplanır.

Örneğin ilk ışık ile ikinci ışık arasındaki mesafe 400 metre olsun. Yeşil dalga hızımız 60 km/saat olsun.

60 km/saat=16,667 m/sn

O halde aracımız 400 metreyi 24 saniye almaktadır (Kalkış süresi ihmal edilmektedir).
İlk ışığımız referans olduğu yani sıfırdan başladığını kabul ettiğimize göre ikinci ışığımızın 24 saniye sonra yeşil yanmaya başlaması gerekmektedir.

Özet olarak programımız kullanıcıdan aldığı verileri gerçeklemektedir. Programımızda aynı zamanda simülasyon kısmında ise hesabımızın doğruluğunu görebilmekteyiz.

Biz eskişehirdeki 2 caddenin yeşil dalga sürelerini 60 km hıza göre hesapladık.

Proje raporları ve kodları en yakın zamanda eklenecektir.

29.5.09

Thread Programlama

Bu makale de sizlere öncelikle basit olarak threadin ne olduğundan bahsedeceğim. Daha sonra C# ve C de iki örnekle nasıl kullanıldığını anlatacağım.
Processler işlemcinin yapılacak işlere aksaklık olmadan belirli zaman aralıklarında hizmet vermesidir. Bu sayede kullanıcıya hem görüntü verilmesi hem de birçok programı aynı anda kullanması imkânı sunulmuş olur. Threadleri ise process içinde bu şekilde değerlendirebiliriz. Bir process içinde farklı işlerin bölünerek yapılmasını sağlar. Hizmet zaman aralığı çok az olursa her thread ya da process arası değişimleri yaparken çok fazla zaman kaybetmiş oluruz. Eğer bu zaman aralığı çok uzun olursa da kullanıcı etkileşimi aksamış olur. Kullanıcı programdan beklediği yanıtı daha geç alır.
Basit olarak thread ve processler birbiri arasında değişim yaparken program işleme de kaldıkları yerleri korurlar ve sıra tekrar kendilerine geldiklerinde bulundukları yerlerden işlerini sürdürürler. Processler arası değişimler gerçekleşirken eğer birden fazla process aynı hafıza alanından veriler kullanıyorsa bu belirli sorunlar yaratabilmektedir fakat ben onlardan bu makalede bahsetmeyeceğim.
Öncelikle thread kullanımının öneminden biraz bahsettikten sonra ilk programa geçmek istiyorum. Threadler bizim normalde tek işlem olarak yapmaya çalıştığımızda verimli sonuçlar alamadığımız durumlarda bize yardımcı olurlar. Örneğin ciddi bir hesaplama yaparken kullanıcıya bunun ilerleyişini göstermek istediğimizde progress bar kullanmak istiyorsak bunu thread kullanmadan yapamayız. Eğer yaparsak progress barımız hesaplama işlemi bittikten sonra çalışmaya başlayacaktır.
İlk programımızda c# da basit olarak thread yaratma ve çağırmaya örnek olacak bir kod göstermek istiyorum. Bu kod aynı zamanda threadin işleyişi için iyi bir örnek olacaktır.
İlk olarak System.Threading kütüphanesini projemize ekliyoruz. Daha sonra global olarak thread ve başlangıç değerini tanımlıyoruz.
ThreadStart thread_baslama;
Thread thread;

Bu kodumuzda c# ın timerı ile thread arasındaki işleyiş farkını göreceğiz. Normal olarak c# daki timer nesnesi interval adında bir değere sahiptir. Bu değer kaç milisaniyede kendini tekrar edeceğini belirler. Dinamik ve global olarak bir timer yaratıyoruz ve bir yerde durması için bir değişken tanımlıyoruz.

System.Windows.Forms.Timer ilerle = new System.Windows.Forms.Timer();

int timersayisi = 0;


Form yüklendiğinde 3 ayrı butonu dinamik olarak yaratıyoruz. Burada dinamik olarak bir nesneyi nasıl yaratacağmızı da görmüş olduk. Bunlardan birisi sadece threadle birlikte ilerleyecek, bir diğeri timer ile ilerleyecek. Son olan ise bunların ilerlemesini başlatacak.



private void Form1_Load(object sender, EventArgs e)
{
this.Text = "thread_karsılastırma";
this.Size = new Size(750, 400);

Button thread_butonu = new Button();
thread_butonu.Text = "Thread";
thread_butonu.Location = new Point(10, 75);
thread_butonu.Name="thread_nesnesi";
this.Controls.Add(thread_butonu);

Button timer_butonu = new Button();
timer_butonu.Text = "Timer";
timer_butonu.Location = new Point(10, 150);
timer_butonu.Name = "timer_nesnesi";
this.Controls.Add(timer_butonu);

Button oynat_butonu = new Button();
oynat_butonu.Text = "Oynat";
oynat_butonu.Location = new Point(10, 225);
oynat_butonu.Click += new EventHandler(oynat);
oynat_butonu.Name = "oynat";
this.Controls.Add(oynat_butonu);

}


Threadimizi çalıştırmak için içine bir fonksiyon yazmamız gerekmektedir. Bu fonksiyonda threade ait olan butonu ilerleteceğiz. Her ilerleyişinde uyku komutu ile 1 milisaniye bekletiyoruz. Mantıksal olarak baktığımızda timer ile aynı işi yapmaktadır. Ayrıca burada dinamik olarak yarattığımız bir nesneye nasıl erişeceğimizi gördük.


private void thread_baslat()
{
for (int i=0;i<500 ;i++ ) { this.Controls["thread_nesnesi"].Location = new Point(this.Controls["thread_nesnesi"].Location.X + 1, this.Controls["thread_nesnesi"].Location.Y); Thread.Sleep(1); } } private void timer_tick(object sender, EventArgs e) { if (timersayisi == 500) ilerle.Stop(); else this.Controls["timer_nesnesi"].Location = new Point(this.Controls["timer_nesnesi"].Location.X + 1, this.Controls["timer_nesnesi"].Location.Y); timersayisi++; } Timerın her ilerleyişinde aynı işi timer butonu için yapıyoruz. Her ikisini de 500 piksel kadar ilerlemesine izin veriyoruz. Oynat butonunda ise thread başlama değerine thread butonumuzu ilerleten fonksiyonu atıyoruz ve onu çalıştırıyoruz aynı zamanda da timerımızı çalıştırıyoruz. private void oynat(object sender, EventArgs e) { System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false; thread_baslama = new ThreadStart(thread_baslat); thread = new Thread(thread_baslama); thread.Start(); ilerle.Interval = 1; ilerle.Tick += new EventHandler(timer_tick); ilerle.Start(); } Normalde thread kullanmak yerine oynat butonumuza tıkladığımızda thread _baslat fonksiyonu çalıştırmayı denersek ilk önce thread butonun 500 piksel ilerlediğini daha sonra timer butonun ilerlemeye başladığını görebilirsiniz. Ama bizim kodumuzu çalıştırdığınızda 2si de aynı anda ilerlemeye başlayacaktır ve thread butonun timer butonuna göre ne kadar hızlı gittiğini göreceksiniz. Bu Thread.Sleep komutunun timerin kendi nesnesin gereğinden çok daha sade olarak çalışıtığının bir kanıtıdır. İkinci örneğimizi linux tabanlı bir işletim sistemi olan Parduste yazdım. Bu örnekte ise C de thread nasıl yaratılır , nasıl kullanılır bunu göreceğiz. Bu örneğimiz ilkinden daha işlevsel çünkü klasik gameboy oyununa benzer bir şey olacak. Bu programda ayrıca ekran temizleme , rastgele sayı üretme , linux de entera basmadan karakter alma ve kuyruk (queue) gibi ek kodları da göreceğiz. Karşıdan max 9 araba gelmektedir ve onlar X şeklindedir. Bizim yönettiğimiz araba ise A şeklindedir. Yol üç şeritledir. Arabamızı sağa sola ilerletmek için a ve d tuşlarını kullanıyoruz. Kullanıcının hangi tuşlara bastığını bir threadle alıyoruz. Şimdi bu threadin kısa koduna bakalım. void *kontrol_tus(void *parameter){ double *p = (double *)parameter; // bu programda kullanmasak da parametreyi bu //şekilde ana programdan alabiliriz. char nereye; while(hak) //hak kullanıcın kaç hakkı kaldığını tutuyor { nereye = mygetch(); if(nereye==97 && bzm_araba>1) //a tuşunun asciisi 97 ve d tuşunun 100
bzm_araba-=1; //bzm_araba bizim arabamızın hangi kulvarda
//olduğunu tutuyor 1,2 ve 3 dışına çıkamaz
if(nereye==100 && bzm_araba<3) bzm_araba+=1; } return 0; } Ana programda threadleri nasıl yaratıp çağırdığımıza bakalım. int main(int argc, char* argv[]){ arabatemizle(); // karşıdan gelen arabaları tuttuğumuz dizinin elemanlarını sıfırlıyor pthread_t araba, kontrol; // threadlerimiz isimleri int arguman1 = 0; //kullanmasak da argümanları pas edebiliyoruz double arguman2 = 1.1; printf("Oyunda Arabalardan Çarpmadan İlerleyeceksiniz, a Tuşu Sola , d Tuşu Sağa Gider 5 Hakkınız Vardır , Oyun Başlıyor"); printf("\n"); sleep(2); //program 2 saniye bekliyor pthread_create(&araba, NULL, arabalar, (void *)&arguman1); pthread_create(&kontrol, NULL, kontrol_tus, (void *)&arguman2); //threadleri yukarda yaratıyoruz. Arabalar ve kontrol_tus thread fonksiyonlarımız. pthread_join(araba, NULL); //burada threadlerimiz son buluyor. Oyunda burada bittiği için printf("Tebrikler %d puanla oyunu bitirdiniz.\n",puan); //puanı burada yazdırıyoruz. pthread_join(kontrol, NULL); return 0; } Asıl kontrolleri (çarpıp çarpmadığımız ve hakkımızın bitip bitmediği ) yaptığımız ve rastgele olarak karşıdan gelen arabaları belirlediğimiz threadimiz ise aşağıdaki gibidir. void *arabalar(void *parameter){ int *p = (int *)parameter; int i; srand(time(NULL)); //rastegele sayıyı zamana göre üretmek için gerekli olan tanımlama yukari: while(hak) { if(sayac==0) { gelen_arabalar[0]=(rand()%3)+1; //arabayı rastgele olarak 1,2 veya 3.yola koyuyoruz } //her zaman 0. indexli elemana atıyoruz çünkü else //queue yapısı olarak ilk giren ilk çıkar { gelen_arabalar[0]=0; //gelen arabaları birer boşluk koyarak belirliyoruz ki } //bizim arabamız gerektiğinde aralardan kaçabilsin for(i=18;i>-1;i--)
{gelen_arabalar[i]=gelen_arabalar[i-1];} //kuyruk sırasını birer ilerletiyoruz


for(i=0;i<19;i++) { switch(gelen_arabalar[i]) //arabaları bulundukları kulvara {case 3:printf(" "); // yerleştiriyoruz case 2:printf(" "); case 1:printf(" X "); case 0: break;} printf("\n"); } switch(bzm_araba) //bizim arabamızı kulvara yerleştiriyoruz {case 3:printf(" "); case 2:printf(" "); case 1:printf(" A "); break;} if(bzm_araba==gelen_arabalar[18]) //eğer son araba ile bizimkinin kulvarı {hak--;goto asagi;} // aynı ise çarptık demektir. asagi gidiyoruz. printf("\n"); if(gelen_arabalar[18]!=0) {puan+=10;} //her araba geçtiğimizde 10 puan alıyoruz sleep(1); // arabalar 1 er saniye bekleyerek ilerliyor system("clear"); //ekranı her seferinde temizliyoruz sayac=(sayac+1)%2; } asagi: if(hak>0)
{printf("%d Hakkiniz Kaldi, Oyun devam ediyor",hak);
arabatemizle();
printf("\n");
sleep(2);
goto yukari;
}
return 0;
}

Linux de kodu çalıştırmak için aşağıdaki resme bakabilrisiniz.




Basit de olsa 2 kodda threadlerin nasıl uygulanacağını görmüş olduk. Kodları aşağıdaki linklerden indirebilirsiniz.

c# kodu

c kodu

readmee yazı

readmee 3. sayı


Uğur Atmaca



Linux getch fonksiyonu referans: http://www.daniweb.com/forums/thread148447.html

24.5.09

Macera Dolu Piknik




Önceden planlandığı gibi tam takım (bilişim günleri ekibi (hemen hemen :) )) sakaryabaşına yola çıktık (metal catal unuttuk). Hemen önde oturanlara okuduğum liseden bahsedip yanından geçerken gösterdim (y.a.ö.l).
Biraz erken gittiğimizi düşünmüş olsam da sonradan gelen bir kaç grubu gördükten sonra iyi bir karar verdiğimizi düşündüm. Bir güzel pohaçalarımı yedikten sonra komik , çok komik , neşeli aylık oyunumuzu oynadık. Daha neler uzun eşşek , yakan top oynayanlar , çift kale maç , voleybol , mangal gibi keyifli aktiviteler. Sakaryabaşı ufaktan beri gittiğim bir yer. Piknik alanı olarak çok güzel bir yer. Yalnız temizlik konusunda biraz sıkıntı farkettim. Bizler gittiğimiz yeri bulduğumuz gibi bırakmadığımız için çok fazla çöp vardı. Biz elimizden geldiğince önce kendimizin olduğu yerdeki çöpleri topladık ve tabiki giderken kendi çöplerimizi. Onun dışında ben , Gamze ,metin , Nilüfer salıncağa bindik (yaprak yakaladık). Sonra aynı grup ayaklarımızı su yılanı bulanan suya soktuk . Artı olarak bu grup ve Alperenle de gölette önce yunus sonra da kayığa bindik.
Beni çok seven sivrisineklerden yakındım. Bunların yerine arı soksa daha iyi olur dedim. Hiç ortalıkta arı yokken (o kadar ete rağmen) geldi benim kolumu birisi soktu. Pek de büyük konusmamak gerek. Bayağı yorulduk. Ama çok zevkli bir piknik oldu. Ben çok mutlu ayrıldım. Nicelerinde görüşmek üzere.

notlar:
ilk vuruşumda top gölete düştü
c# baslangıc dersleri yazacagım blogumda dedim
ufak yengeç gördük
sun tshirtleri giydik (selim,alperen,metin,ben,serap (saydım hepsini))
kavak polenleri çok kaşındırıyor.

13.5.09

Beğendiğim , Söylemeden edemediğim


1.Abdüsselam

Bir numara lezzet. O nasıl sostur ya yemeyenler hayatlarındaki eksikliğin farkında değildir. Büyükşehirbelediyesi arka sokağında bir pasajda. Yukarda yeşil tabelada yazar ismi. Ben ne yazsam fayda etmez. Gidin , tadın sonra da haklısın dersiniz anlatılmaz.


2. Kurukahveci Mehmet Efendi

Pek güzeldir kahvesi. Bilişim günlerinde geldi kendi kendine bize de ne de güzel de kahve verdi pek çok içtik. Teşekkürler.

not: Ben bilgisayarda hiç de uzun da yazamıyorum da :)

10.5.09

Esogü Bilişim Günleri 2009 Sonu



Yorgunluğu tam üzerimden atmadan kısa bir değerlendirme yazayım istedim. Onun dışında özel bir kaç şeyden de bahsedeceğim. Öncelikle organizasyon ekibine ve konuşmacılara çok teşekkür ediyorum. Umarım herkes için faydalı bir etkinlik oldu.
Çok daha faydalı olacağını düşündüğüm bilgisayar mühendisliği insanlarının (öğrencilerinin ve öğretim görevlilerinin) parmakla sayılacak kadar az olması herkesin kafasında soru işareti bıraktı. Organizasyon ayağına kadar gelirken insanların bizim sınıftan sadece 1 kişi gelmişti. Buna gerçekten aklım ermedi.
Paralel programlama sunumu için Tayfun Akçay' a ayrı bir teşekkürü borç bilirim. Benim için en faydalı oturumdu 3 gün içinde gerçekleşen.
Dağınık yazıyorum ama Esogü Kongre Merkezinin güzelliğinden bahsetmeden edemeyeceğim. Gerçekten üst standart bir yer olmuş, eminim içeri bir kafasını sokan herkes bunu fark etmiştir. Bizim tüm oturumlarımız 700 kişilik salondaydı ve son oturumda bile salon hemen hemen doluydu. Bu yüzden dinleyiciler ayrıca bir alkışı hakettiler.
Ücretsiz kurs çekilişlerinden bizlerden kimseye bir şey çıkmadı (organizasyon ekibinden) :). 

Seneye görüşmek üzere...