Fruity Loops
![]() |
Fruity Loops nedir? Fruity Loops şarkı veya ritm oluştururken kullandığımız bir mixleyici ve aynı zamanda gelişmiş bir MIDI destekleyicisi olarak tanımlanabilir. Fruity Loops’ta mixlerinizi pattern tabanlı yaparsınız.Bu pattern’ları (yani müzik parçacıklarını) kendiniz özgürce tasarlarsınız ve playlistte alt alta koyarak istediğiniz ritmi veya şarkıyı oluşturursunuz.Bunun uygulamasına geçmeden önce programın ana bölümleri hakkında bilgi vermek istiyorum. 1) Browser |
I- BROWSER :
Yukarıdaki resimde I ile gösterdiğim bölüm browser.Browser bize yabancı bir kelime değil, anlayacağınız gibi mixi yaparken kullandığımız ses dosyalarının veya sample’ların listelendiği kısım browser olarak adlandırılıyor.Programın tam sürümünde browser’da sayısız enstruman sesi, extra effektler, loop’lar, önceden yapılmış sample’lar, kullanıcının önceden tasarladığı wav uzantılı dosyalar vb. mix yapmak için gerekli herşey bulunuyor.Listede üzerine geldiğimiz dosyaya iki kez tıkladığımızda anında o sesi duyabiliyoruz, bekleme yok gecikme yok.Ekranın solunda bir sütun şeklinde her zaman elimizin altında bulunması kolay erişim sağlıyor.
II- STEP SEQUENCER:
II nolu bölüm step sequencer.Bu paneli pattern’ları oluştururken kullanıyoruz.Pattern’da kullanacağımız efekt veya enstrumanları alt alta panele diziyoruz ve sıralanmış düğmeleri uygun şekilde aktif hale getirerek ritmik birşeyler yapabiliyoruz.
![]() |
1)Main Shuffle: Bu buttonu sağa sola kaydırarak ritminizde kullandığınız seslere değişik bir hava verebilirsiniz.
2)Graph Editör: Bu editörü kullanarak, pattern’daki seçili kanaldaki her bir adım için (ki bu “adım” dediğim paneldeki her bir düğme) ayrı ayrı pan (sol/sağ), vol (ses yüksekliği), filter cut (filtre ayarı), filter res (filtre ayarı2), pitch (ses perdesi) ve shift ayarlarını yapmak mümkün. 3)Keyboard Editör: Bu editör her bir adım için klavyeden nota girmemizi sağlıyor. 4)Channels&Steps: Yani kanalların ve adımların bulunduğu panel.Her bir ses düğmesinin solunda iki tane yuvarlak ayar düğmesi var bunlardan biri pan biri ses yükseklik ayar düğmesi.Bu ayar düğmelerinin altında küçük yeşil ışık kanalın şu anda unmute konumunda olduğunu belirtiyor.Ses dosyasının adının yazdığı büyük düğmenin (C_Kick,C_HC vb.) yanında yanan ışık ise seçili kanalları belirtiyor.Yandaki resimde TS404#1 seçili mesela… 5)Step Leds: Play konumundayken o anda hangi adımdaysak, bu bölümde o adımın ışığı yanar ve böylece ritmi gözümüzle takip etmemizi sağlar. 6)Pattern Title: Pattern’imize ne isim verdiysek burda o yazar.İsim vermezseniz yandaki gibi hiç bişey yazmaz. |
III- PLAYLIST:
Step sequncer panelini kullanarak dilediğimiz sayıda pattern yapabiliriz.İşte yaptığımız bu pattern’ları playliste döşeyerek şarkımızı oluştururuz, parçamızı playlist yardımıyla takip ederiz.
IV- DİĞER:

1) Ana Panel: Bu panelde menüler, menülerin hemen altında cursorun o anda bulunduğu konum hakkında açıklama bulabileceğimiz bir ipucu alanı (hint field) bulunuyor. Bölümün sağ tarafında ise ana ses yükseklik ve ses perdesi ayar düğmeleri bulunuyor.
2) Transport Panel: Bu panelde ise play,stop,record düğmeleri bulunuyor.Play düğmesinin hemen solunda pattern/song seçeneği bulunuyor ve seçili olanın ışığı sarı şekilde yanıyor.Pattern seçili olduğu zaman play’e bastığımız zaman o anda aktif bulunan pattern’i dinliyoruz.Song seçili olduğu zaman ise playliste döşediğiniz pattern’ların oluşturduğu parçanın tamamını dinliyoruz.Bölümün en sağında parçanın temposunu ayarlamak mümkün.
3) Pattern Panel: Programda her patternin bir numarası var.O anda aktif olan pattern’ın numarasını buradan tesbit etmek veya değiştirmek mümkün.
UYGULAMA:
Şimdi basit bir uygulama yapalım.Hemen her hareketli şarkıda bulunan ve “dım tıs dım tıs” olarak tabir edilen ritmi oluşturalım.
Program ilk açıldığında transport panelde pat/song seçimi “pat” şeklinde ve tempo 140′dır. Pattern panelde ise pattern numarası 1 seçilidir.Step sequencer panelinde ise standart sesler TS404#1, C_Kick, C_HC, C_HH, C_Snare bulunmaktadır.Eğer bu şekilde değilse gerekli ayarları yapın.
önce;
![]()
şeklinde C_Kick kanalını ayarlayın.
Daha sonra yukarıda Pattern Panelde pattern numarasını 2 olarak değiştirin.Sakın az önce ayarladığınız C_Kick adımlarına bişey olduğunu sanmayın.Pattern numarasını 1′e getirirseniz onların kaybolmadığını göreceksiniz… Neyse, pattern no’sunu 2 olarak değiştirdikten sonra;
![]()
şeklinde C_HH kanalını ayarlayın.
şimdi açın Playlist’inizi (açmak için kısayol F5) ve;
![]() |
Şeklinde, tasarladığınız iki pattern’i döşeyin…
Son olarak Transport Panel’de pat/song seçimini “song” yapın. Şimdi “Play” butonuna basabilirsiniz… |
Database Seçimi
Database Secimi
Öncelikle konuya tamamen yeni olanlara yönelik olarak „Database“ nedir sorusunun cevabini verelim:
Database (türkcesi Veritabani ama bundan böyle Database kelimesini kullanacagim):
Database, icerigi kolaylikla erisilebilir, yönetilebilir ve güncellenebilir sekilde düzenlenen bir data toplulugudur.En cok taninan Database tipi ise birkac farkli yoldan yeniden düzenlenebilen ve erisilebilen data olan „relational Databse“ yani Iliskisel Database’dir.
Burada karsimiza günümüzde cok kullanilan ve aslinda Database denilince aslinda „Relational Database“ kastedilen bir terim ortaya cikmaktadir :
Iliskisel bir Database, database tablolarini yeniden düzenlemeden birkac farkli yoldan erisilebilen ya da yeniden derlenen datayi teskil eden düzenli-tanimli tablolardan olusan bir data toplulugudur.Iliksisel Database 1970 yilinda E.F:Codd tarafindan gelistirilmistir.
Iliskisel Database’e olan standart kullanici ve uygulama programi arabirimi „Structured Query Language“ (Yapisal Sorgulama Dili, kisaca SQL).SQL ifadeleri hem interaktif sorgular (query) icin hem de raporlar icin data elde etmek icin kullanilir.
Buraya kadar kafalarda olusan mantiksal ve fiziksel kavramlari örneklerle aciklamaya calisalim :
Database tablolardan (table) olusur.Tablolar ise alanlardan (column) olusur.Temelde string ve sayi olma üzere degisik alan tipleri vardir.Bir Database’de birden fazla tablo olabildigi gibi bir tablonun da birden fazla alani olabilir.Bir sistemde ayni isimde bir Database, o Database’de ayni isimde bir tablo ve o tabloda ayni isimde bir alan olabilir.
Bu kavramlar asagidaki sekil üzerinde daha anlasilir olacaktir :
Desktop Database – Server Database
Aslinda Database’leri genel olarak iki kisma ayirabiliriz.Birincisi „Desktop Database“ ve ikincisi „Server Database“.Desktop Database’lere örnek :
· Microsoft Access
· FoxPro
· FileMaker Pro
· Paradox
Desktop Database’lerin avantajlari :
· Desktop database’ler pahali degildirler
· Desktop database’ler kullanici dostudur (user-freindly).
· Desktop database‘ler web cözümlerini destekler.
Bunlari söyledikten sonra, „Server Database“ leri „kim kullanir ki o zaman?“ sorusuna Desktop Database’lerin dezavantajlarini siralayarak cevap verelim :
· Desktop Database’ler genelde bir kullanici desteklerler.Düreticilerin demeclerine ragmen genelde desktop databaseler ayni anda sadece bir kisinin database’i degistirmesine izin verirler.Cok kullanicili bir ortamda desktop Database’i kullanmak cok kötü sonuclar dogurabilir.Genel olarak söylenen eger Database’i birden fazla kisi kullanacaksa „Server Database“ kullanilmasi tercih edilmelidir.
· Desktop Database’lerin güvenligi zayiftir. Cogu desktop Database‘i basit bir sifre mekanizmasina sahiptir.Eger güvenlik ve log tutma özelliklerini istiyorsaniz kesinlikle „Server Database“ kullanmalisiniz.
· Dekstop database’ler internet icin tasarlanmamistir. Eger basit olarak datanizi internete acmak istiyorsaniz bir desktop Database’i yeterli gelebilir.Fakat, internet kullanicilarinin datayi degistirebildigi ve yeni datanin girebildigi interaktif bir sistem olusturmak istiyorsaniz server tabanli bir Database kullanmaniz gerekmektedir.
Server Database’ler ise gercekten daha büyük imkanlar sunmaktadir.Baslica dünyada en cok kullanilan ve tanilan Server Database’ler sunlardir :
· Oracle
· Informix
· MS-SQLServer
· Sybase
· DB2
· MySQL
· Postgresql
Server Database’lerin genel olarak avantajlari ya da sagladiklari yararlar sunlardir :
· Esneklik. Desktop kuzenlerinin tam tersine, server tabali database’ler onlara yüklediginiz her data yönetim probleminin üstesinden gelebilirler.Programcilar cok severler cünkü Database merkezli özel uygulamalarin hizli gelisimini saglayan programci-dostu uygulama programci arabirimleri (Application Programmer Interface, yani API) vardir.Hatta Oracle, Informix, Sybase, DB2 gibi Database‘ler farkli platformlari (Isletim Sistemleri) destekjlemektedir.
· Güclü performans. Server tabanli Database’leristediginiz kadar güclü olabilirler.Önemli Database’ler sizin kurabileceginiz cok uygun donanimlarda cok verimli bir sekilde calisacaktir.Modern Database’ler birden fazla yüksek hizli islemcilerle, cluster sunucularla, yüksek bandgenisligine sahip aglarla ve hata toleransli depolama teknolojisiyle (fault tolerant storage technology )calisabilirler.
· Ölceklenebilirlik (Scalability). Bu özellik öncekiyle cok yakindir.istenildigi sekilde gerekli donanimlari artirarak gerekli kullanici sayisi veya disk alani genisletilebilir.
Tabi hersey bir anda tozpembe degil, Server Database’lerin de dezavantajlari vardir :
· Özel bilgi/egitim gereklidir. Server tabanli Database’ler tabii ki oturdunuz yerden ögrenilecek birsey degildir.Donanim ve yazilima yatirima baslamadan önce gerekli özel egitimi almaniz tavsiye edilir.Bu egitim bu önemli yatirimda ihtiyaclari ortaya koyamada faydali olacaktir ve gerekli altyapiyla etkili bir büyüme ve gerceklestirme stratejisi saglayacaktir.
· Pahalidir. Server tabanli Database’le saglanan yararlar tabii ki size maddi maliyeti vardir.Öncelikle bircok Database’in bagli oldugu pahali yüksek performansli sistemleri satin almak icin önemli bir doananim yatirimi yapmaniz gerekecektir.Daha sonra , basit tek islemicili bir sistem icin 3000$ ile 15000$ arasinda lisans parasi ödemeye hazir olmaniz gerekir.
· Son kullanicilar icin zordur. Genel olarak , satin almadiginiz müddetce son kullanicilariniz kullanici dostu arabirimlere sahip olmayacaktir ve kullanicilariniz SQL ögrenmesi icin tabii ki sabir göstermeniz gerekir.Desktop Database’ler genelde server tabanli Database’ler icin iyi birer arabirimdir.Örnek olarak , bircok organizasyon server tabali Database’lere ulasmak icin bilinen kullanici dostu arabirim olan Microsoft Access’i kullanmaktadir.
Simdi asil konumuza gelelim ve Database secerken gözönünde bulundurmamiz gereken noktalara deginelim. Diyelim ki siz bir Uygulama gelistireceksiniz , bu bir web uygulamasi, ögrenci isleri programi, taksitli satis programi ya da su faturasi tahsilat programi olabilir.Herseyden önce ihtiyaclarinizi ortaya koymaniz gerekir.Bu aslinda en zor olan kisimdir.Cünkü teorik olarak ihtiyaclarinizi belirledikten sonra bir de pratikte ortaya cikan ihtiyaclar bazen sizi zor durumda birakabilir.Bunun icin „en kötü durumda“ faktörü ve data’nin ve sistemin (kullanici acisindan) büyüme faktörü gözönünde buludurulmalidir.
Konuyu daha fazla uzatmadan bir Database’e karar verebilmek icin gerekli olan sorular genel olarak sunlardir :
· Hangi platformlari (isletim Sistemlerini) destekliyor?
· Destekledigi arabirimler neler (odbc, jdbc, DBD, native)?
· Database ne derecede güvenli?
· Backup/Restore (Yedekleme/Yedek Dönme) imkani sunuyor mu?
· Lisans Stratejisi nedir?
· Warm Backup özelligi var mi?
· Transaction Destegi var mi?
· Trigger destegi var mi?
· Support (Destek)‘u var mi ve ne kadar güvenilebilir?
· Administration (Yönetim ve bakimi) kolay mi?
· Mirroring destegi var mi?
· Replication özelligi var mi?
· Parallel Server (Clustering) özelligi var mi?
· Lojiksel olarak limitleri nelerdir?
Bu sorulari cogaltmak tabii ki mümkün.
Bu sorularin detaylarina girmek sanirim yazinin genel amacina uygun olacaktir.
Hangi platformlari (isletim Sistemlerini) destekliyor?
Aslinda öncelikle Database’imizi hangi Isletim Sistemi üzerinde calistirmak istedigimiz önemli.Diyelim ki Database Server’in Linux üzerinde calismasini istiyorsak ve bu tek secenegimiz ise, otomatik olarak MS-SQL Server’i elemis oluyoruz cünkü MS-Sqlserver sadece Windows platformunu desteklemektedir.Ayrica bazi Database’lerin belirli Isletim Sistemlerini desteklemedigini göz önünde bulundurmak gerekir.En cok kullanilan Isletim Sistemleri : HP-UX, AIX, Linux, Solaris, Windows NT, Windows 2000, Windows XP, Digital UNIX, Open BSD, FreeBSD vs.
Destekledigi arabirimler neler (odbc, jdbc, DBD, native)?
Uygulamamizla dogrudan alakali olan bir nokta, cünkü kullandigimiz programlama dilinin destekledigi baglanti türlerini Database’imizin de desteklemesi gerekir.Örnegin bir Database’in ODBC sürücüsü yoksa o Database’le Herhangi bir Visual Basic-ODBC tabanli bir program yazamayiz.
Örnegin perl ile bir program yazacaksak mutlaka o Database’in DBD sürücülerinin üretici tarafindan saglanmasi gerekmektedir.Ayni sekilde java uygulamalari icin de bu durum gecerlidir.
Database’in güvenlik stratejileri?
Düsünün ki bir bankacilik uygulamasi gelistiriyorsunuz , bu durumda Database’de tutulacak bilgilerin güvenligi ve gizliligi sizin icin cok önemlidir.Fakat bir web uygulamasinda cok da önemli olmayabilir.
Burada dikkat etmemiz gereken diger bir özellik ise Database’in kendi icinde saglamis oldugu güvenlik stratejisidir.Mesela tablo bazinda belirli kisilere yetkilendirme yapilabiliyor mu?
Buna informix’ten bir örnek verecek olursak :
grant select,update on table fatura to mehmet; mehmet kullanicisina fatura tablosu üzerinde select (okuma) ve update (kayit degistirme) yetkisi vermektedir.
Mesela Oracle’da yeni cikan bir özellik ise column (alan) bazinda belirli kullanicilara yetkiler verilebiliyor.
Backup/Restore (Yedekleme/Yedek Dönme) imkani sunuyor mu?
Cok önemli uygulamalarda yedek alma islemi cok önemlidir ve de online yani Database aktifken yapilabiliyor olmasi gerekir.Düsünün bir fabrikada 7/24 saat üretim yapiliyor ve database’in her an Online olmasi gerekiyor.Bu durumda sececeginiz Database‘in online backup alma özelligi mutlaka olmasi gerekir (warm backup).Diyelim ki Database online iken backup ya da dump özelligi var, peki alinan yedegin data tutarliligi bu durumda var mi?
Düsünün ki yedek basladiginda bir memur fatura tahsilati yapiyor ve islemin yarisindayken (yani bilgilerin bir kismi Database’e kaydedilmis durumda) yedek bitiyor.Herhangi bir crash (Sistemin ya da Database’in hata verip datalarin bozulmasi) durumunda o yedegi restore (yedegi dönme) ettik, bu durumda datalar tutarsiz olacaktir.
Diger önemli bir nokta ise aldiginiz backup’tan sadece bir tablo restore edilebiliyor mu?Bu durum da cok karsilasilan bir durumdur, mesela birisi sql le calisirken yanlislikla bir tablonun tamamini ya da belli bir kismini sildiginde tek care yedekten geri dönmektir.
Lisans Stratejisi nedir?
Öncelikle open source olan Database’lerin ücretsiz oldugu herkes tarafindan bilinmektedir.Diger ücretli olan (commercial) Database’lerde ise herbirinin degisik lisans stratejileri vardir.Örnegin concurrent (ayni andaki kullanici sayisi) lisansi ya da named (yani toplam kullanici sayisi) lisanslar mevcuttur.Bir de cpu sayisina bagli olanlar da var.
Ortalama olarak her 6 ayda bir yeni sürüm ciktigini kabul edersek, versiyon güncellemelerinin ücretli olup olmadigi ve de güncellemenin ne kadar sürdügü de büyük önem kazanmaktadir.
Transaction Destegi var mi?
Transaction, Database anlaminda begin ile commit arasinda yapilan islemin tamamina transaction denir.Transaction destegi temel olarak verilerin bütünlügü ve tutarliligi icin önemlidir.
Diyelim ki bir internet kullanicisi bir alisveris sitesinde ürünleri gezmektedir ve belirli ürünleri sepete eklemekte ya da sepetten cikarmaktadir.Zamanla bu bilgilerin bir kismi tablolara yazilmis olabilir.Diyelim ki kullanici alisverisi sonlandirmak icin devam etti ve kredi karti bilgilerini girdigi yerde alisveristen vazgecti ve baglantisini kopardi, iste bu durumda o ana kadar yaptigi bütün data hareketlerinin geri döndürülmesi (rollback) gerekir, bu da transaction destegi ile mümkündür.
Diger bir örnek de mesela Database’imiz aktifken birden elektrikler kesildi ve Server’i yeniden baslattik ve Database’i start ettik.Kesinti aninda yarim kalan bütün islemler o sekilde birakilmaz tabii ki, yarim kalan (Database dilinde commit olmamis ) bütün transaction’lar rollback edilir.Bu sekilde Database tutarli bir duruma geri döndürülmüs olur.
Transaction’in cok önemli olmasi sebebiyle artik cogu Database’in bu destegi vardir.Ancak cok kritik uygulamalarinizda bu konunun daha detayina inerek Database’i incelemekte fayda var.
Trigger destegi var mi?
Trigger, bir Database’de belirli bir tablodaki bir satir degismesi gibi belirli bir islem gerceklestiginde otomatik olarak bir islemi baslatan bir dizi SQl ifadesidir.Bir trigger bir olaydan (insert, delete ya da update ifadelerin belirtilen tabloda olusmasi) ve bir hareketten (ilgili prosedür) olusur.Trigger’lar degisen ya da eklenilen bir datanin tutarliligi icin kullanilir.Mesela basit olarak sirket tablosuna yeni bir kayit eklendiginde (insert) git log tablosuna sirket nosunu ve o anki tarih ve zamani kaydet (insert).
Support (Destek)‘u var mi ve maliyeti nedir?
Gelistirdiginiz uygulamalariniz ne kadar kaliteli olursa olsun, kullandiginiz Database’in destegi yoksa ya da cok zayifsa bu pek iyi bir durum degildir.Örnegin uygulamanizin cok spesifik bir ayrintisinda eger Database’de bir bug ortaya ciktiysa ve siz yeni bir versiyon ya da gecici bir cözüm bulamiyorsaniz sistem kullanilamaz haldedir ve proje „basarisizdir“!!
Oracle’dan bir örnek vereyim , 1 yillik destek anlasmasi lisans ücretinin %20 sidir ve genelde Database’inizin down oldugu durumlarda birkac saat icinde bir cozüm sunarlar.Informix’te de bu durum asagi yukari aynidir.
Postgresql ve MYSQL’de ise commercial support veren kurumlar disinda newsgroup’lara baglisiniz ve cogunlukla soru ya da sorunlariniza cok hizli cevaplar alabilirsiniz, fakat hicbir zaman size garanti yoktur.Sanssiz bir sekilde bir bug ortaya cikmis ise bir sonraki versiyonu beklemeniz gerekir ya da o bug’in olmadigi bir diger versiyona gecmeniz gerekir ki bu da zaman ve ugrasi demektir.
Administration (Yönetim ve bakimi) kolay mi?
Aslinda en iyi Database bir anlamda isteklerinize %100 cevap veren ama ayni zamanda administration yani yönetimi ya da bakimi olan Database’dir.
Diger önemli bir nokta ise yönetimi ve bakimi icin gerekli altyapi ve egitim ve bütün bunlarin maliyetidir.Örnegin Oracle’in yönetimi belki de en zor olanidir , bu sebepten dolayi da egitimleri cok pahali ve de fazladir.
Informix’in administation’u ise daha kolaydir fakat görsel yönetim programlari o kadar iyi degildir.Postgresql ve MySql’in ise dökümanlari bol olmasina ragmen egitimleri cok fazla yaygin degildir.Görsel yönetim programlari da her ikisi icin de mevcuttur.Örnegin MySQL icin MySQL Control Center ve Postgresql icin pgadmin, tora gibi.
Mirroring destegi var mi?
Mirroring aynalama demektir ve güvenlik stratejisinin bir parcasi olabilir.Database’in mirror destegi olmasi bir avantajdir ve datalarinizin Disk üzerinde 2 kez kaydedilmesi demektir ve birisinin bozulmasi halinde diger kopyasindan online devam edebilmektedir.Güvenligin yani sira performans acisindan da faydalidir, cünkü bir read (okuma) isleminde paralel yani her iki kopaydan ayni anda okuyabilmektedir , bu da hiz demektir.
Bildigim kadariyla Postgresql ve MySQL’de mirroring özelligi kendi bünyesinde yoktur..
Replication özelligi var mi?
Replication , Database server bazinda kopyalama demektir.Örnegin 1000 tane subesi olan bir banka düsünün ve her subede 50 kullanici olsa toplam 50000 kullanici demektir ve ayni saatler icerisinde sadece bir Server‘a erismeleri biraz garip olurdu sanirim (böyle bir durumu düsünemiyorum bilen varsa lütfen mail atsin).Bunun icin en azindan birden fazla Database farkli yerlerde fakat merkezi bir Database’de olusan bir degisim diger bütün databaselere zamanla iletilir.
Bir hesaba bütün diger subelerden erisilebildigine göre Database’deki kayitlarin bir kere ayni olmasi gerekmektedir.Bu durumda farkli sehirlerde replike edilen birden fazla server dusunursek ve her birinin üzerinde bir Database calisirsa ve bütün bunlar replike edilirse yükler dagilmis ve performans artmis olur.Özet olarak bir Database’in replike edilmesi demek o Database’deki degisiklikler birebir diger Database’lere aktarilmasi demektir.
Replication’un sagladigi bir avantaj da bir Database’in ariza görmesi halinde (down) diger Database’in durumu idare edebilmesidir.
Parallel Server (Clustering) özelligi var mi?
Bu özellik daha cok büyük Database’ler icin gecerlidir.Bir Server düsünün o anki teknolojiyle donanim olarak maximum seviyede donatilmis fakat toplam kullanici sayisini kaldiramiyor, ya da basit olarak bir Database’i 2 server üzerinde calistirmak istiyorum ya da bir Database’de bir ariza olustugunda otomatik olarak diger Database durumu idare etsin istiyorsam Database’in Parallel Server özelligi olmasi gerekir.
Oracle, Informix , DB2 ve MS-Sqlserver in parallel özellikleri var fakat normal Database lisansindan ayri bir fiyatla satilmaktadir.Postgresql ve MySql in ise böyle bir özelligi yoktur.
Lojiksel olarak limitleri nelerdir?
Her Database’in kendi mimarisi vardir ve buna bagli olarak da bazen teorik de olsa limitleri vardir.Bir tablodaki column (alan) sayisi, bir tablonun maximum alacagi satir sayisi, bir Database’in maximum kullanabildigi alan, bir alanin maximum büyüklügü gibi faktörler büyük Database (>100Gb)’ler icin önemlidir.
Simdi birkac Database’in limitlerini vermeye calisalim:
PostgreSQL
Asagidaki bilgiler aynen http://www.ca.postgresql.org/users-lounge/limitations.html adresinden alinmistir.
Bir Database’in maximum büyüklügü sinirsiz(60GB databaseler mevcut)
Bir tablonun maximum büyüklügü 64 TB bütün Isletim Sistemlerinde
Bir satirin maximum büyüklügü sinirsiz 7.1 ve sonrasi versiyonlarda
Bir alan icin maximum büyüklük 1GB 7.1 ve sonrasi versiyonlarda
Bir tablodaki maximum satir sayisi sinirsiz
Bir tablodaki maximum alan sayisi 1600
Bir tablodaki maximum index sayisi sinirsiz
Tabii ki bunlar sinirsiz degildirler, fakat eldeki disk alanina ve hafiza/swap alanina bagimlidir.Bu degerler normalin disinda büyük olursa performans sorunu yasanabilir.
Oracle
Bir tablodaki maxiumum index sayisi sinirsiz
Maximum icice altsorgu (nested queries) sayisi 255
Maximum Database user’i 65525
Bir tablodaki maximum alan sayisi 1000
Bir tablodaki maximum satir sayisi sinirsiz
Maximum Tablespace sayisi 64K
Maximum block sayisi 16Kb
Kaynak : http://download-uk.oracle.com/docs/html/A97297_01/ch1_admin.htm#i92495
Informix
Maximum Database büyüklügü 2 Terabyte
Maximum alan sayisi 32000
Maximum tablo sayisi 2^31-1
MySQL
http://www.mysql.com/doc/en/Features.html :
Büyük Database’ler olusturmak mümkündür.50 milyon kayit iceren bazi Database’ler kullaniyoruz ve 60000 tablo ve yaklasik 5 milyar satir sayisi olan kullanicilar biliyoruz.Bir tabloda maxiumum 32 index kullanilabilir.Her bir index 1 ile 16 arasinda alandan olusabilir.Maximum index genisligi ise 500 byte’dir(bu MySQL Server’i derlemekle degistirilebilir).Bir indexi CHAR ya da VARCHAR olarak kullanabilirsiniz.
Maxiumum tablo büyüklügü 4Gb (3.22) 3.23 versiyonuyla birlikte myIsam tablo tipinde 8 milyon Tb yani 2^63 büyüklügünde bir tablo mümkündür.
Maximum alan büyüklügü 4Gb (long text ya da long blob)
Veritabani Yönetimi
Veritabani Yönetimi nedir?
Veritabani yönetiminin ne oldugunu ögrenmek icin öncelikle veritabaninin ne oldugunu bilmek gerekir.Veritabani basit olarak bilgi depolayan bir yazilimdir.Bircok yazilim bilgi depolayabilir ama aradaki fark, veritabanin bu bilgiyi verimli ve hizli bir sekilde yönetip degistirebilmesidir.
Veritabani, bilgi sisteminin kalbidir ve etkili kullanmakla deger kazanir.Bilgiye gerekli oldugu zaman ulasabilmek esastir.Indeksi olmayan bir kütüphane ve bütün kitaplarin ayni kapaga sahip oldugunu düsündügünüzde kütüphane kullanicilarinin ne kadar cok isi olacagini tahmin edersiniz.
Bir veritabani bir kütüphanenin mükemmel bir indeks sistemi oldugu gibi , ayni zamanda kütüphanenin kendisidir.
Veritabani yönetimi ve veritabani yönetcisinin rolü kütüphanecininkine benzerdir.Bilgiyi olusturmak ya da elde etmekten sorumlu degiller fakat varolan bilgiyi yönetirler.
Gercek veritabani yönetimi cok sorumluluk isteyen bir istir, veritabaninin her an düzgün ve verimli calismasini saglamak ve standartlari belirleyip veritabaninin icerdigi veriyi yönetmektir.
Bircok insan veritabaninin sadece bilgiyi tutan birsey oldugunu zanneder, fakat bundan cok öte birseydir ve önceden dedigim gibi bilgi sisteminin kalbidir.
Veritabani yönceticisi ve veritabani yönetimi bundan dolayi bütün mevkilerin eksenidir.
Veritabanindaki bir problem , cok pahali sonuclar dogurabilir. Bir bankanin veritabaninin durmasi demek , her an yapilan yüzlerce belki de binlerce islemin , dolayisiyla müsterilerin beklemesi demektir.
Ayni problem bir supermarket icin de gecerlidir, müsteriler kasada kuyruk olusturur, kisaca bütün sistem durabilir.
Bundan dolayi veritabani yöneticisi ilk olarak sistemin düzgün calismasini saglamali, ikinci olarak da düzgün calismadiginda onu mümkün oldugu kadar hizli bir sekilde calisir hale getirmektir.
Sanirim veritabani yönetimi nedir sorusuna basit de olsa bir cevap olustu kafanizda.
Simdi veritabani yöneticisinin yaptigi isleri mümkün oldugu kadar genel hatlariyla anlatmaya calisalim.
Veritabani yöneticisinin görevleri
Görevleri kisaca su basliklar altinda toplanabilir :
- Veritabani Yaziliminin Kurulmasi ve upgradeler (yeni versiyonlar)
- Veritabani olusturulmasi
- Veritabani baslatma/durdurma
- Kullanicilari ekleme ve yetkilendirme
- Veritabani yedekleme ve yedekten geri dönme (backup&recovery)
- Veritabani performans ayarlari (performance tuning)
- Veritabani tablo-/indekslerin büyüme kontrolu (fragmentation control)
- Veritabani Yaziliminin Kurulmasi ve upgradeler (yeni versiyonlar)
Veritabaninin yaziliminin kurulmasi isin genelde en basit tarafidir.Farkli Isletim Sistemlerine özgü hazir derlenmis yazilim “kurulum notlari” dikkate alinarak kurulur.
Veritabaninin yogun bir sekilde kullanilmasindan sonra bazi buglarin (hatalarin) ortaya cikmasiyla üretici firma tarafindan cikarilan yeni versiyonlarin kurulumu gerekebilir.
- Veritabaninin olusturulmasi
Veritabanindan verileri okuyan, yazan, silen ve gerektiginde de degistiren yazilimlara “uygulama yazilimlari” denir.Bu uygulamalarin tasarimi sirasinda uygulama gelistiricilerle birlikte veritabaninin da tasarimi yapilmalidir.Iste bu noktada veritabani yöneticisi bir takim özellikleri dikkate alarak bir “veritabani modeli” ortaya cikarir.Bu esnada normalizasyon yöntemleri gibi optimizasyonlar yapilir.
Bu olusan model daha sonra fiziksel olarak, kullanilacak olan veritabani yazilimi (Oracle, Informix, MySQL, Postgresql vs. ) araciligiyla olusturulur.Veritabanini tanimlarken , verimli bir sekilde kullanimdan bahsettik. Iste bu noktada veritabanini fiziksel olarak olustururken dikkat edilmesi gereken hususlar vardir:
- Cok yogun islem görecek olan tablo-/indeksleri mümkün oldugu kadar birbirinden fiziksel olarak ayirmak gerekir. (mümkünse farkli diskler, degilse farkli tablespace’ler kullanmak gibi)
- Sort (siralama) islemleri icin bir veya birden fazla temp (gecici) alanlar tanimlanmalidir ( Oracle’da temp tablespace , Informix’te temp dbspace olarak gecer)
Not: Bir sistemdeki en yavas komponent Harddisk’ler oldugu icin (mikroislemci ve hafizaya gore) veritabaninin fiziksel dagilimi da cok büyük önem arz etmektedir.Hatta bilgi Giris/Cikis (I/O) islemini hizlandirmak icin RAID (parallel okuma özelliginden yararlanmak icin ) sistemleri kullanilir.
Kagit üzerinde olusturulan veritabani alanlari, tablolari, indeksleri, viewlari , kullanicilari ve yetkilendirmeleri olusturmak icin genelde bir program (script) yazilir ve bu program calistirildiginda sirayla bunlar olusturulur.
Bu program mantiksal kod olarak genelde su sekildedir :
-veritabani olusturma
-depolama alanlari tanimlama
-kullanici ve yetkilerini tanimlama
-tablo, indeks, view, vs objeleri olusturma
Bu program ayni veritabani modeli baska bir bilgisayara kurulacagi zaman cok büyük kolaylik saglar.
- Veritabani baslatma /durdurma
Veritabani baslatma/durdurma islemi önemli bir konudur, özellikle de durdurma islemi verilerin bütünlügünün saglanmasi acisindan cok önemlidir.Cesitli durdurma yöntemleri vardir :
-
- Veritabanina bagli bütün oturumlarin kendiliginden sona ermesini bekleyen durdurma (gracefully shutdown)
- Veritabanina bagli bütün oturumlar durdurma komutu verildikten hemen sonra sona erdirme seklinde durdurma (immediate shutdown)
- Bir de veritabani processlerini hemen sona erdiren durdurma ( abort shutdown)
Durdurmanin sekli , asil veritabani baslatilirken önem arz ediyor.Her baslatma isleminde veritabani sunucusu yarim kalan islerin olup olmadigini kontrol eder (fast recovery). Cünkü yarim kalan islemler (transaction) gerektiginde geri aliniyor (commit görmemisse ,rollback) gerektiginde de veritabanina isleniyor (commit görmüsse, rollforward).Bu sekilde veritabanindaki verilerin bütünlügü saglanmis oluyor.
Bir de bazen bilgisayarin (veritabaninin üzerinde calistigi sunucu ) yeniden baslatilmasi sirasinda (reboot) veritabaninin otomatik olarak baslatilmasi isteniyorsa , bu islemi yapan ufak bir program yazmak gerekebiliyor.
- Kullanici ekleme ve yetkilendirme
Veritabaninda yapilan islemler cok cesitli olabildigi icin mutlaka belirli yetkileri olan kullanicilar tanimlanmalidir.Veritabani yazilimlari genellikle kendi kullanici tanimlama ve yetkilendirme sistemine sahiptir.Veritabanini sahibi onu olusturan kisidir ve yetkilendirmeyi de bu kullanici yapar.
Yetkilendirme cesitleri veritabani yazilimina baglidir , ama genellikle tablo bazinda, okuma, yazma, silme ve kayit ekleme , tablo olusturabilme, indeks ekleme islemleri her veritabani yaziliminda mevcuttur. Bütün kullanicilarin sinirsiz yetkiye sahip olmasini , özellikle de büyük veritabanlarinda bekleyemeyiz herhalde.
- Veritabani yedekleme/yedekten geri dönme (backup&recovery)
Veritabaninda olusabilecek hatalar (bug) , yanlislikla silinen kayit ya da tablolar, donanimsal hatalardan kaynaklanan (genelde harddisk) problemler, yangin gibi felaketler veritabanindaki bilgilerin ya bozulmasina ya da tamamen kaybolmasina yol acabilir. Tabi bu istenmeyen bir durumdur ve de her gün olan bir olay degildir. Veritabanindaki bilgilerin degeri tasarlanacak olan yedekleme startejisini büyük ölcüde belirleyecektir. Yedekleme stratejileri cok cesitlidir ve bu konuda veritabani yazilimlari kendi yedekleme programlarini sunmaktadir. Alinabilecek önlemler ya da yedekler genelde su sekilde siralanabilir :
-Veritabanindaki degisikliklerin bire bir baska bir sunucuya iletilmesi (replication, cluster gibi cözümler)
-Veritabaninin bulundugu diskleri aynalamak (mirroring yani RAID sistemleri).
-Düzenli araliklarla veritabaninin yedeklenmesi (baska bir diske, ya da bant aygitina (tape device)). Buna genelde export deniliyor.
-Tablo bazinda ASCII formatinda yedek almayi saglayan veritabanlarinda , önemli tablolari düzenli araliklarla yedeklemek.
Gelisen tekonolojiyle birlikte veri kaybini önleme yazilim ya da donanimlari hizla cogalmaktadir.
Bazi büyük veritabanlari (Terabyte’lar seviyesinde) yedeklemek günlerce süreceginden sadece donanim olarak güvenlik önlemleri aliniyor. Cünkü yedegi günler süren bir veritabanini yedekten geri dönmek (recovery) daha fazla zaman alacagi icin cok kritik veritabanlari yedeklemeyi ya ek bir sunucuyu replication olarak ya da diskleri gerektigi kadar aynalayarak gerceklestirmektedirler.
6. Veritabani performans ayarlamasi ( performance tuning)
Her veritabani baslatilirken okudugu bir konfigurasyon dosyasi (oracle’da init<db>.ora , informix’te onconfig, postgresql’de postgresql.conf) vardir. Bu dosyada , sistemden alacagi hafiza miktari (memory allocation), olusturacagi process adeti, veritabani sistem bilgilerinin yeri, yedekleme yeri ve türü, hatalarini yazdigi dosya adi (error log file), gibi bir cok ayrinti vardir.Bu degerlerin her birine parametre (parameter) denir.Bu degerler bazen cevre degiskeni (environment variable) araciligiyla veritabani baslatilirken etkin kilinabilir ya da veritabani calisiyorken online de yapilabilir. Genelde bu degerler veritabani kullanici sayisina, veri miktarina ya da yogunluguna ve isletim sistemine bagli olarak sonradan ayarlamayi gerektirir.
Örnegin zaman icinde kullanici sayisinin ya da veri giris/cikisinin artmasiyla birlikte kullanacagi kaynaklar da artacagindan gerekli parametreleri degistirmek gerekir.
Tabi her parametrenin kriterleri vardir. Bu kriterleri veritabanindaki sistem tablolarindan okuyarak anlamli bir sekilde gösteren hazir yazilimlar oldugu gibi bu tür programlar kolaylikla veritabaniyla haberlesecek bir programlama diliyle programlanabilir.
- Veritabani tablo-/indekslerin büyüme kontrolu
Veritabani tablo ya da indeks eklerken veritabanindan ilk basta tahsis edecegi miktar (initial size) ve bu alan dolduktan sonra tahsis edecegi miktar (next size) belirtilebilir. Belirtilmezse veritabaninin default olarak verdigi miktar (genelde 8 Kbyte) kullanilir. Tablolar ilk basta bos olarak olusturulacagi icin bunlar fiziksel olarak yanyana olacaklardir ve kayitlar eklendikce bunlar büyüyeceklerdir. Asagidaki sekil bunu güzel bir sekilde aciklamaktadir.
Seklin tamamininin harddisk oldugunu varsayarsak icindeki tablolarin büyüdükce rasgele yerlerden alan tahsis ettigini görüyoruz.Bu kutularin her birine extent deniliyor ve istenmeyen bir durumdur. Bir tabloya ait bütün alanlarin toplu hale getirilmesi performans acisindan cok önemlidir, en yavas donanim olan harddisk kafasinin bir tablonun bütün kayitlarini okumasi icin mümkün oldugu kadar az hareket etmesi gerekir.Bundan dolayi tablo ilk olusturulurken özellikle kayit sayisinin cok arttigi tablolarda büyük bir alan tahsis etmemiz gerekir. Zamanla tablolarin bu sekilde dagilmasi olayina “fragmentation” , tablolarin daginik halden toplu hale getirilmesine de “reorganisation” ya da “defragmentation” denir.
Konuyu toparlayacak olursak olusabilecek hatalari önceden gören ve ona gore tedbir alinmasi gerektigi icin, veritabani yönetiminin cok planli yapilmasi gerekir.Veritabani yönetimini kolaylastiran hazir yazilimlar vardir.Bunlar genelde windows tabanli görsel uygulamalardir ve veritabani sunucusunu genel hatlariyla gözlemle icin faydalidir.Bazi gelismis olanlarinda veritabani , tablo, indeks, kullanici olusturma gibi islemler cok daha kolay bir sekilde yapilabilmektedir.Oracle yazilimiyla birlikte gelen “Oracle Enterprise Manager” , Postgrsql icin PgAdmin , Informix icin Informix System Administrator (ISA) bu tür yazilimlara örnektir.
Verinin degerine gore yedekleme stratejisi bir kacinilmazdir cünkü yedegin önemi ancak ihtiyac duyuldugu zaman ortaya cikar.
Visual C#.NET ile Labirent Uygulaması
Visual C#.NET ile Labirent Uygulaması
PROBLEM
Bir labirent uygulaması yazacaksınız. Labirent bir grid (matris) şeklinde tasarlanacak; labirentin ebatlarını ve iç değerlerini bir input dosyasından okuyacaksınız. Input dosyasının ilk satırı boyutları verecek, ikinci satır labirente giriş noktasını, üçüncü satırda labirentten çıkış noktasını, dördüncü satırdan itibaren de labirentin değerlerini okuyacaksınız. Input dosyasının ismi odvinp.txt olacak. Odvinp.txt ye örnek verecek olursak: 5-5 lik bir labirentte, giriş noktasının 2. satır, 1. sütun ve çıkış noktasının 5.satır 4. sütun olduğunu varsayarsak. (Bu gösterimde 1leri duvar yada dolu, 0larıda boş ve gezinebilir varsayıyoruz.)
5,5
2,1
5,4
1 0 0 0 1
0 0 1 0 1
0 0 1 0 0
1 0 1 0 1
1 1 0 0 1
Labirentte hareket yönleri yukarı-sağ-sol-aşağı yönleridir, çapraz hareket edilemeyecektir. Giriş noktasından başlayarak çıkış noktası yakalanmaya çalışılacak ve böyle bir güzergah bulunabilirse güzergah noktalarını bir text dosyaya yazacaksınız, bu dosyanın ismi okul numaranızın son 4 hanesi.txt şeklinde olacak. Eğer bir güzergah bulunamaz ise bu dosyaya ‘uygun yol bulunamadı’ yazılacak. Uygun yolda her nokta sadece 1 kere ziyaret edilmiş olunmalı. Yukarıdaki örneğin çıkış dosyası yan yana veya alt alta yazılı şekilde giriş ve çıkış noktalarıyla birlikte 2,1 2,2 1,2 1,3 1,4 2,4 3,4 4,4 5,4 şeklinde olacak.

Zip’li dosyayı indirmek için tıklayın.
KAYNAK KODLAR
/// /// Sonuca giden asil yolu tutan sinif /// mys isimli sinifimda tanimladigim alar arraylist inde tutuluyor. /// public class actualRoad { public Point p; public actualRoad(Point P) { p = P; } } /// /// Labirentin 1 ve 0 larini tutan yapim /// public struct myarr { public Int16 val; public bool visited; public myarr(Int16 Val, bool V) { val = Val; visited = V; } } /// /// Bir çok islemi ve fonksiyonlari yaptigim sinifim /// public class mys { private Point current; // üstünde bulunulan nokta private Point endP; // labirentin çikis noktasi private int row,col; // labirent kaç satir ve sutündan olusuyor. private int[] bestway = new int[4]; // ilerleme için en iyi nasildir. public ArrayList alAR = new ArrayList();// çikisa giden asil yol. actualroad isimli sinif public myarr[,] myArr; // labirentin 1 ve sifirlarini tutan degisken public Stack stack; // birden fazlama ilerleme yönü oldugunda o noktayi tutan yigin /// /// Row getter i /// public int Row { get { return row; } } /// /// Col getter i /// public int Col { get { return col; } } /// /// mevcut nokta getter ve setter i /// public Point Current { get { return current; } set { current = value; } } // end of point current /// /// son nokta getter ve setter i /// public Point EndP { get { return endP; } set { endP = value; } } // end of EndP /// /// boyutlarin atandigi method. /// public void setLength(int Row,int Col) { stack = new Stack(); row = Row-1; col = Col-1; myArr = new myarr[Row,Col]; } /// /// Tarama isleminde en iyi yönü belirleyen method. /// public void findBestWay() { if ((current.X <= endP.X)&&(current.Y <= endP.Y)) { bestway[0] = 1; bestway[1] = 2; bestway[2] = 3; bestway[3] = 4; } else if ((current.X >= endP.X)&&(current.Y <= endP.Y)) { bestway[0] = 1; bestway[1] = 4; bestway[2] = 3; bestway[3] = 2; } else if ((current.X <= endP.X)&&(current.Y >= endP.Y)) { bestway[0] = 3; bestway[1] = 2; bestway[2] = 1; bestway[3] = 4; } else if ((current.X >= endP.X)&&(current.Y >= endP.Y)) { bestway[0] = 3; bestway[1] = 4; bestway[2] = 1; bestway[3] = 2; } } /// /// actual road a ekleme islemini yapan method /// ///
|
eklenecek nokta public void addAR(Point p) { alAR.Add(new actualRoad(p)); } /// /// actual road tan silme islemini yapan method /// public void removeAR() { alAR.RemoveAt(alAR.Count-1); } /// /// üstünde bulunulan noktayi gidildi yapiyor. Birdaha gitmemek için /// public void makeVisited() { myArr[current.X,current.Y].visited = true; } /// /// Noktanin duvarmi degilmi oldugunu belirliyor. /// /// kontrol edilecek nokta /// boolean sonuc public bool isitWall(Point p) { if (myArr[p.X,p.Y].val==1) return true; else return false; } /// /// stackten deger okuyor. Tikanma durumlarinda çalisiyor. /// /// 1=nokta var.0=stackte deger yok.Çikisada gidilemedi. public byte readStack() { if (stack.Count>0) { current = ((Point)stack.Pop()); return 1; } else return 0; } /// /// Üstünde bulunulan nokta son nokta mi /// /// sayac /// x yönü /// y yönü /// 2=evet çikis.1=hayir devam et aramaya public byte isitFinal(sbyte cnt,sbyte wayX,sbyte wayY) { if (cnt>1) stack.Push(current); current = new Point(current.X+wayX , current.Y+wayY); addAR(current); makeVisited(); if (current == endP) return 2; else return 1; } /// /// üstünde bulunulan noktanin etrafina bakiyor. /// /// gidilecek yönü belirliyor. /// x yönü /// y yönü /// sayici public void lookAtSides(out sbyte way,out sbyte wayX,out sbyte wayY,out sbyte cnt) { findBestWay(); byte i; wayX = wayY = cnt = way = 0; for (i=0;i<4;i++) switch (bestway[i]) { case 1: if ((myArr[current.X,current.Y+1].val==0)&&(!myArr[current.X,current.Y+1].visited)) { if ((wayY==0)&&(wayX==0)) { wayY = 1; way = 1; } cnt++; } break; case 2: if ((myArr[current.X+1,current.Y].val==0)&&(!myArr[current.X+1,current.Y].visited)) { if ((wayY==0)&&(wayX==0)) { wayX = 1; way = 2; } cnt++; } break; case 3: if ((myArr[current.X,current.Y-1].val==0)&&(!myArr[current.X,current.Y-1].visited)) { if ((wayY==0)&&(wayX==0)) { wayY = -1; way = 3; } cnt++; } break; case 4: if ((myArr[current.X-1,current.Y].val==0)&&(!myArr[current.X-1,current.Y].visited)) { if ((wayY==0)&&(wayX==0)) { wayX = -1; way = 4; } cnt++; } break; } } } //// yukarıdaki kodlar kullandıımız sınıfın kodları idi /// şimdi de form kısmında yazdıımız kodlara bakalım. /// /// Summary description for Form1. /// public class frmLabirent : System.Windows.Forms.Form { public int x,y; private TextureBrush tbWall; private TextureBrush tbRoad; private TextureBrush tbR,tbL,tbU,tbD,tbS,tbF; private mys myS; [STAThread] static void Main() { Application.Run(new frmLabirent()); } /// /// Okunan matrisin etrafini birlerle çevirmek için kullaniliyor. /// public void surroundbyWall() { int i; for (i=0;i<=myS.Col;i++) { myS.myArr[0,i].val=myS.myArr[myS.Row,i].val=1; } for (i=0;i<=myS.Row;i++) myS.myArr[i,0].val=myS.myArr[i,myS.Col].val=1; } /// /// Ilk üç satirda bilgileri okumak için yazilan method /// /// gelen string /// hangi satir public void assignParam(string str,int type) { int x , y; int i = str.IndexOf(“,”); x = Int32.Parse(str.Substring(0,i)); y = Int32.Parse(str.Substring(i+1,str.Length-i-1)); Point p = new Point(x,y); if (type==0) // set length { bmp = new Bitmap(y*20,x*20); lblSize.Text = x.ToString()+“,”+y.ToString(); myS.setLength(x+2,y+2); } else if (type==1) // start point { myS.Current = p; lblSP.Text = p.X.ToString()+“,”+p.Y.ToString(); } else if (type==2) // end point { myS.EndP = p; lblEP.Text = p.X.ToString()+“,”+p.Y.ToString(); } } /// /// Kontrol isleminin yapilmasi. Baslangiç ve bitis noktasi /// duvar olmasin vs. /// public void controlP() { if (myS.isitWall(myS.Current)) { lblMsg.Text = “A wall cannot be a starting point !!! Rearrange the file”; btnFind.Enabled = false; } else if (myS.isitWall(myS.EndP)) { lblMsg.Text = “A wall cannot be a ending point !!! Rearrange the file”; btnFind.Enabled = false; } else { lblMsg.Text = “You can now click the \”FIND A R..\” button.”; btnFind.Enabled = true; } } /// /// Text dosyasiyi okuyarak myArr isimli diziye atiyan ve /// birlere ve sifirlara göre resmi olusturan method /// private void btnLoad_Click(object sender, System.EventArgs e) { int row,col,i; row = col = i = 0; StreamReader rdr = new StreamReader(Directory.GetCurrentDirectory()+“/Odvinp.txt”); myS = new mys(); assignParam(rdr.ReadLine(),0); pBox.Width = bmp.Width; pBox.Height = bmp.Height; Graphics myGO = Graphics.FromImage(bmp); assignParam(rdr.ReadLine(),1); assignParam(rdr.ReadLine(),2); surroundbyWall(); bool enter = false; string line; while ((line = rdr.ReadLine())!=null) { i = col =0; while (i<line.Length) { enter = false; if (line[i].ToString()!=” “) { Region myReg = new Region(new Rectangle(col*20,row*20,(col+1)*20,(row+1)*20)); if (line[i].ToString()==“1″) { myGO.FillRegion(tbWall,myReg); myS.myArr[row+1,col+1].val = 1; enter = true; } else if (line[i].ToString()==“0″) { myGO.FillRegion(tbRoad,myReg); myS.myArr[row+1,col+1].val = 0; enter = true; } if (enter) { col++; if (col>myS.Col-2) break; } } i++; } row++; if (row>myS.Row-2) break; }// end of while rdr.Close(); controlP(); myGO.DrawImage(bmp,0,0); pBox.Image = bmp; } /// /// Tarama isleminde ilerledikçe resmide es zamanli olarak /// boyamak için kullanilan method. /// /// hangi texture ile boyanacak. /// hangi nokta boyanacak private void copyPortion(sbyte way,Point p) { Graphics myGO = Graphics.FromImage(bmp); Rectangle rect = new Rectangle((p.Y-1)*20,(p.X-1)*20,20,20); Region myReg = new Region(rect); switch (way) { case 1: myGO.FillRegion(tbR,myReg); break; case 2: myGO.FillRegion(tbD,myReg); break; case 3: myGO.FillRegion(tbL,myReg); break; case 4: myGO.FillRegion(tbU,myReg); break; case 5: myGO.FillRegion(tbS,myReg); break; case 6: myGO.FillRegion(tbF,myReg); break; } myGO.DrawImage(bmp,0,0); pBox.Image = bmp; } private void pBox_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e) { x = e.X / 20; y = e.Y / 20; } private void startP_Click(object sender, System.EventArgs e) { lblSP.Text = x.ToString()+” , “+y.ToString(); } private void endP_Click(object sender, System.EventArgs e) { lblEP.Text = x.ToString()+” , “+y.ToString(); } /// /// Formun yüklenmesinde resmi boyamak için gereken /// alt küçük resimleri yüklüyorum. /// private void Form1_Load(object sender, System.EventArgs e) { tbWall = new TextureBrush(new Bitmap(Directory.GetCurrentDirectory()+“/1.bmp”)); tbRoad = new TextureBrush(new Bitmap(Directory.GetCurrentDirectory()+“/0.bmp”)); tbR = new TextureBrush(new Bitmap(Directory.GetCurrentDirectory()+“/rigth.bmp”)); tbL = new TextureBrush(new Bitmap(Directory.GetCurrentDirectory()+“/left.bmp”)); tbU = new TextureBrush(new Bitmap(Directory.GetCurrentDirectory()+“/up.bmp”)); tbD = new TextureBrush(new Bitmap(Directory.GetCurrentDirectory()+“/down.bmp”)); tbS = new TextureBrush(new Bitmap(Directory.GetCurrentDirectory()+“/stop.bmp”)); tbF = new TextureBrush(new Bitmap(Directory.GetCurrentDirectory()+“/finish.bmp”)); } /// /// label ve picture box i güncellemek için /// public void update2() { lblXY.Update(); pBox.Update(); } /// /// Taram isleminin baslangiç noktasi /// private void btnFind_Click(object sender, System.EventArgs e) { btnFind.Enabled = false; sbyte wayX,wayY,way,cnt; byte goOn = 1; // goOn=1-> go on searching, // goOn=0-> there is no way to the end // goOn=2-> ok, found it. myS.makeVisited(); myS.addAR(myS.Current); while (goOn==1) { myS.lookAtSides(out way,out wayX, out wayY,out cnt); if (cnt == 0) { goOn = myS.readStack(); if (goOn==1) while (myS.Current != ((actualRoad)myS.alAR[myS.alAR.Count-1]).p) { copyPortion(5,((actualRoad)myS.alAR[myS.alAR.Count-1]).p); myS.removeAR(); System.Threading.Thread.Sleep(250); update2(); lblXY.Text = myS.Current.X.ToString()+“,”+myS.Current.Y.ToString(); } } else { copyPortion(way,myS.Current); goOn = myS.isitFinal(cnt,wayX,wayY); } lblXY.Text = myS.Current.X.ToString()+“,”+myS.Current.Y.ToString(); System.Threading.Thread.Sleep(250); update2(); } StreamWriter sr = File.CreateText(Directory.GetCurrentDirectory()+“/5051.txt”); if (goOn==2) { copyPortion(6,myS.Current); for (int i = 0;i<myS.alAR.Count;i++) sr.WriteLine(((actualRoad)myS.alAR[i]).p.ToString()); lblMsg.Text = “A road is found.The direction is in the 5051.txt file.”; } else if (goOn==0) { lblMsg.Text = “THERE IS NO A ROAD TO THE END POINT !!!”; sr.WriteLine(lblMsg.Text); } sr.WriteLine(“–”); sr.WriteLine(“5051 Mesut GÜRBÜZ”); sr.Close(); } |



bir yorum yazın