DNA Zinciri Eşleştirme

Merhaba arkadaşlar. Bugün Üniversitelerimizin spesifik olarak verdiği bir ödev konusuna değineceğim.

Konumuzun adı DNA zinciri eşleştirme. Çoğunuz özellikle sayısal bir geçmişi herkes zaten bunun ne anlama geldiğini biliyorsunuzdur. Bu yüzden fazla detaya girmeyeceğim.

Peki ödev bizden ne yapmamızı istiyor. Bunu açıklayalım.

Bu ödev; kullanıcının girdiği farklı DNA zincirlerinin eşleşip, eşleşmediğini kontrol edecek. Bu kontrolü bizim yazdığımız bir program sağlayacak.

Bildiğiniz üzere kısaca DNA zincirlerinin üzerinde nükleotitler bulunur. Bu nükleotitler; A (Adenin), T(Timin), G (Guanin), S(Sitozin) ve U(Urasil) dir. Biz urasille ilgilenmeyeceğız ve toplamda dört tane nükleotidimizin olduğunu varsayacağız.

Bu nükleotitler arasında şöyle bir eşleşme kuralı vardır.

A = T ve G = S

Yani bir zincirde bulunan Adenin’in karşısına başka bir zincirde bulunan Timin geliyorsa bu eşleşme uyumludur Aksi takdirde eşleşme olmaz. Programımızı da bunları dikkate alarak yazmamız gerekiyor.

Programımıza input olarak DNA zincirlerini nükleotitleriyle beraber gireceğiz ve çıktı olarak hangi zincirlerin eşleştiği sonucunu alacağız.

Ben bu programı C dili ile tasarladım tabi ki başka diller ile de tasarlanabilir.

Program kodu;

JDBC – Statement ve PreparedStatement arasındaki farklar

Merhaba arkadaşlar. Bu yazımda önceden benim de çok merak ettiğim bir konu olan Statement ve PreparedStatement arasındaki farkları ve birbirlerine göre avantajlarını, dezavantajlarını anlatacağım.

Statement ve PreparedStatement ifadelerini mutlaka bir yerlerde kullanmışızdır. Özellikle herhangi bir SQL sorgusu çalıştırmak istediğimizde bu ikisinden herhangi birini kullanırız. Görünüşte hiçbir farkı olmayabilir ama arka tarafta işler farklı işliyor 🙂

Peki hangisini ne zaman hangi durumlarda kullanmak daha faydalıdır buna bakacağız.

Yazdığımız herhangi bir SQL sorgusunu Statement durumunda çalıştırdığımızı varsayalım. Bu sorgu her çalıştırıldığında veri tabanının belleğinde bu sorgunun bir örneği saklanır. Bu sorgunun binlerce kere çalıştırıldığını düşünürsek bu durum zararlı olabilir. Veri tabanı performansı düşebilir veya bağlantı kopmaları yaşanabilir. Bu durumda PreparedStatement kullanmak faydalı olabilir. Herhangi bir SQL sorgusunu PreparedStatement durumunda çalıştırdığımızı düşünelim. Böylece veri tabanında bu sorgusunun sadece bir kere örneği saklanır ve bin kere de çalıştırsak bu sorgunun veri tabanının belleğinde sadece bir örneği tutulur. Böylece PreparedStatement daha performanslı olabilir.

Tabi PreparedStatement her zaman kullanılacak diye bir şart yok. Örneğin bir uygulamamız olduğunu düşünelim ve sürekli farklı sorguların gönderildiğini düşünelim. Bu durumda Statement kullanmak daha mantıklı olabilir ama sürekli aynı sorgular üzerinde çalışıyorsak tabi ki PreparedStatement kullanmak daha akıllıca olacaktır.

Umarım sizi bu konu hakkında biraz olsun fikir sahibi yapabilmişimdir. Bir daha ki yazımda görüşmek üzere..

Java – Static Anahtar Kelimesi

Java programlama dilindeki en önemli anahtar kelimelerinden biri de static kelimesidir. Hatta bir çok kez karşılaşmışızdır bu kelimeyle ama tam olarak anlayamamışızdır. Bu yazımda elimden geldiğince static kelimesinin Java’da ne işe yaradığını anlatacağım ve kullanımı hakkında örnekler yapacağım.

Sınıf ve Nesne Değişkenleri

Bir sınıf oluşturduğumuzda genellikle ilk önce değişkenlerimizi tanımlarız. Bu tanımladığımız değişkenler aslında o sınıftan oluşturduğumuz her nesne için ayrı ayrı oluşturulurlar. Mesela araba adında bir sınıfımızın olduğunu düşünelim ve bu sınıfa ait plaka, model yılı ve marka adında değişkenlerimiz olsun. Bu değişkenler araba nesnelerine özgüdür. Yani, üç tane arabamız olduğunu düşünürsek bellekte her arabamız için ayrı ayrı plaka, model yılı ve marka bilgileri tutulmaktadır. Bu yüzden bu değişkenlere nesne değişkeni de diyebiliriz. Bazen bunu aşmak isteriz ve aynı sınıfa ait nesnelerden bağımsız değişkenlerde yaratmak isteriz. Bu yaratacağımız değişkenlere de sınıf değişkeni denir. İşte static kavramı burda devreye giriyor.

Static anahtar kelimesini kullanarak tanımladığımız değişkenler sınıf değişkeni olarak adlandırılır. Mesela yukarıda anlattığım örneğe bağlı olarak araba sayısı diye bir değişken yaratabiliriz. Bu değişken bize o sınıftan kaç tane araba yaratıldığı bilgisini versin. Böyle olması için bu değişkenimizi static olarak tanımlamalıyız. Sınıf(static) değişkenleri o sınıftan oluşan herhangi bir nesneye özgü değil, sınıfa özgü değişkenlerdir ve sınıfa ait bilgileri taşırlar. İstediğimiz kadar nesne tanımlayalım farketmez sınıf değişkenleri bellekte bir kere yer kaplarlar. Nesne değişkenleri ise oluşturulan nesne kadar bellekte yer kaplarlar.

Static değişken kavramını anlatan örnek olarak küçük bir program yazalım.

static_araba

Yukarıdaki kodda araba sınıfımızdan oluşturacağımız nesnelere ait değişkenler tanımladık. Bir tanede araba_sayisi adında nesnelerden bağımsız sınıf değişkeni tanımladık. Bu değişkenimizin değeri Araba sınıfından her nesne yarattığımızda artacak.

Şimdi bir de main sınıfımıza bakalım.

main_static

Çalıştırdığımızda aşağıdaki çıktıyı alırız.

cikti

Gördüğünüz üzere başlangıçtaki araba sayımız sıfırdır çünkü hiç araba yaratmadık. İki araba nesnesi yaratıldığında da iki sonucunu ekranda görmüş olduk. Static değişkenleri çıktıdan da anlayacağınız gibi hem sınıf adı ile hem de nesne referansları ile çağırabilirsiniz. Hepsinde de aynı çıktıyı alırsınız. Ben sınıf adı ile çağırmanızı tavsiye ederim kodun anlaşılabilirliği açısından.

Static Metodlar

Tabi ki static kelimesinin kullanımı sadece değişkenlerle sınırlı değildir. Metodlarla da kullanılabilir. Şimdi bu metodlara bakalım.

Normalde bir sınıftaki bir metodu çağırmak istiyorsak o sınıfın nesnesi üzerinden çağırırız. Nesnelerden bağımsız değişkenler yaratabildiğimiz gibi bağımsız metodlar da yaratabiliriz. Bunun için static anahtar kelimesini kullanırız. Bu metodları çağırabilmek için nesne oluşturmamız gerekmez ve direk sınıf üzerinden çağırabiliriz.

Şimdi önceki örneğe bağlı olarak şu koda bakalım.

metod_araba

Gördüğünüz gibi araba_sayisi değişkeni private static olarak tanımlanmıştır ve araba sayısı sonucunu döndüren static bir metod tanımlanmıştır. Bu sefer araba sayisi değişkenine static metodumuz üzerinden erişeceğiz.

Şimdi aşağıdaki koda bakalım.

main_metod

Kodun çıktısı :

cikti_metod

Araba sınıfımız içindeki metod static metod olduğu için bu sınıfın herhangi bir nesnesini oluşturmadan direk çağırmamız mümkündür. Tabi ki static değişkenlerde de olduğu gibi bu metodları nesneler üzerinden de çağırabiliriz ancak bu kodun anlaşılabilirliği açısından tavsiye edilmez.

Şunu da hatırlatmakta fayda var; static metodlar içinden static olmayan bir öğeye erişemeyiz. Bu aslında static metodların en önemli kuralıdır.

Static Bloklar

Static bloklar; static değişkenlere ilk değer atamasını yapmak için kullanılan kod bloklarıdır. Bunlara “static initializer” denmektedir. Bu bloklar static değişkenler belleğe yüklendikten hemen sonra çalıştırılırlar. JVM(Java Virtual Machine), o sınıfa ait bir nesne oluşturmadan önce static blokların çalışmasını garanti eder.

Şimdi şu koda bakalım.

blok

Yukarıdaki koda baktığımızda static blok içerisinde 10 adet sayıdan oluşan bir dizi oluşturulduğunu ve bu dizinin her bir elemanına 0 ile 99 arasında random değerler atandığını görüyoruz. Bu blok sayesinde dizi değişkeni yaratıldığı anda 10 adet rastgele sayı ile doldurulmaktadır. Static bloklar içerisinde static metodlarda olduğu gibi static olmayan öğelere erişmem mümkün değildir.

Başka bir yazıda görüşmek üzere..

Java – Timer Kullanımı

Merhaba arkadaşlar. Bu yazımda Java’nın Timer sınıfı üzerinde duracağım. İlk önce Timer sınıfının ne için kullanıldığını anlatalım.

Timer sınıfı; bir kod bloğunun ne zaman veya ne sıklıkta çalışacağını belirlemek için kullanılır. Timer sınıfını kullanabilmek için aşağıdaki paketi import etmemiz gerekir.

java.util.Timer

Timer sınıfından bir nesneyi aşağıdaki yapılandırıcılar ile yaratabiliriz.

Timer()
Timer nesnesi yaratır.

Timer(String name)
Timer nesnesini bizim belirleyeceğimiz özel bir adıyla yaratır.

Timer sınıfından yaratılmış bir nesne aşağıdaki metodlar ile kullanılabilir.

void cancel()
Timer’ı sona erdirir.

int purge()
Sona erdirilen tüm görevleri ilgili timer nesnesinin görev kuyruğundan kaldırır.

void schedule(TimerTask task, Date time)
Belirtilen görevin hangi zamanda çalışacağını belirler.

void schedule(TimerTask task, Date firstTime, long period)
Belirtilen görevi hangi zamanda başlatacağını ve ne sıklıkla çalışacağını belirler.

void schedule(TimerTask task, long delay)
Belirtilen görevi ne kadarlık bir gecikmeyle başlayacağını zamanlar.

void schedule(TimerTask task, long delay, long period)
Belirtilen görevi ne kadarlık bir gecikmeyle başlayacağını ve ne sıklıkla çalışacağını belirler.

void scheduleAtFixedRate(TimerTask task, Date firstTime, long period)
Belirtilen görevi hangi zamanda başlatacağını ve hangi sabit oranlı periyodlar ile çalışacağını belirler.

void scheduleAtFixedRate(TimerTask task, long delay, long period)
Belirtilen görevi ne kadarlık bir gecikme ile başlayacağını ve hangi sabit oranlı periyodlar ile çalışacağını zamanlar.

Örnek olarak 5 den geriye sayan bir program yapalım. 0 olduğunda da tekrar başa dönsün.

Programın çıktısı aşağıdaki gibidir.

timer

MySQL – Kullanıcı Yetkilendirme

Merhaba arkadaşlar. Bu yazımda veri tabanı sistemlerinde kullanılan kullanıcı yetkilendirme özelliğinden bahsedeceğim.

Bildiğiniz üzere her veri tabanı sisteminde bir ya da birden fazla kullanıcı bulunmaktadır ve her veri tabanı kullanıcısının belli yetkileri vardır. Mesela sistem admini veri tabanıyla ilgili tüm yetkilere sahipken başka bir veri tabanı kullanıcısı sadece ona verilmiş yetkileri kullanabilir.
Bu yetkiler temelde ikiye ayrılır.

Birincisi tablo şeması üzerinde sahip olunan yetkilerdir. Bu yetkilere örnek verecek olursak; tabloya yeni bir alan ekleme olabilir, alanın veri tipini değiştirmek olabilir, tablo eklemek veya silmek olabilir. Kısacası bu yetkiler sadece tablonun şeması üzerinde kullanılabilecek yetkilerdir.
İkincisi ise tablo verisi üzerinde sahip olunan yetkilerdir. Bu yetkilerin ne olduğundan bahsedecek olursak; tabloya yeni kayıt ekleme (insert), tablodaki kayıtları çekme(select), tablodaki kayıtları güncelleme(update) ve tablodaki kayıtları silme(delete) işlemlerinin hepsi bu yetkiler sayesinde yapılır.

Peki herhangi bir veri tabanı kullanıcısına nasıl yetki verilir, bundan bahsedelim.
İlk önce bir kullanıcı yaratalım.
MySQL’de kullanıcı yaratmak için CREATE USER komutunu kullanırız.

CREATE USER ‘username’@’localhost’ IDENTIFIED BY ‘password’

Kullanıcımızı yarattıktan sonra sıra geldi yetki vermeye..
MySQL’de herhangi bir kullanıcıya yetki vermek için GRANT komutunu kullanırız.

GRANT privileges ON object TO user;
privileges : kullanıcıya verilmek istenen ayrıcalıklardır.
object : veri tabanının ismi veya herhangi bir veri tabanındaki tablonun ismidir.
user : yetkilerin verileceği kullanıcıdır.

Birkaç örnek yaparsak;
GRANT ALL ON magaza TO ‘hakan’@’localhost’;
Bu sorgunun görevi; magaza veri tabanındaki tüm yetkileri hakan adlı kullanıcıya vermektedir. Tüm yetkileri verdiğimiz için kısaca ALL komutunu kullanabiliriz.

GRANT SELECT,INSERT,ALTER ON okul TO ‘zeynep’@’localhost’;
Bu sorgunun görevi ise; okul veri tabanındaki SELECT, INSERT ve ALTER yetkilerini zeynep adlı kullanıcıya vermektir.

Peki bir kullanıcının yetkilerini nasıl geri alırız bunu açıklayalım.
MySQL’de yetki geri alma işlemi REVOKE komutuyla yapılmaktadır.
REVOKE privileges ON object FROM user;

Örnek olarak birkaç sorgu yazarsak;
REVOKE DELETE,UPDATE ON magaza FROM ‘hakan’@’localhost’;
Bu sorgunun görevi; hakan adlı kullanıcıdan mağaza veri tabanı üzerindeki kayıt silme ve kayıt güncelleme yetkilerini geri almaktır.

REVOKE SELECT ON okul FROM ‘*’@’localhost’;
Bu sorgunun görevi ise; tüm kullanıcıların okul veri tabanı üzerindeki kayıt görüntüleme yetkisini geri almaktır. ‘*’ işareti tüm kullanıcıları belirtmek için kullanılmıştır.

Tabi yetkilendirme işlemleri sadece bunlarla sınırlı değildir. Yetkilendirme işlemleri fonksiyonlar, prosedürler veya triggerlar üzerinde de yapılabilir.

Yığıttan Kuyruğa Veri Aktarımı

Merhaba arkadaşlar. Bu yazımda size veri yapılarının iki önemli yapısı olan yığıt ve kuyruk yapısı arasında veri aktarımının nasıl yapılacağını anlatacağım.

Hatırlatmakda fayda var. Yığıt yapısı sondan erişimlidir. Elemanlar yığıt yapısında sondan eklenir ve sondan çıkarılır. Kuyruk yapısında ise FIFO (First In First Out) mantığı uygulanmaktadır. Yani yığıttan farklı olarak ilk giren her zaman ilk çıkar. Kuyruğa eleman ekleme arkadan, eleman çıkarma ise önden yapılır. Aslında kuyruk yapısını bilet almak isteyen yolcuların oluşturduğu kuyruk olarak da düşünebilirsiniz.

Yığıttan kuyruğa veri aktarımı mantığın dışına çıkmadan şu şekilde anlatılabilir.

İlk önce kuyruğa ekleyeceğimiz yığıt elemanlarını sondan başlayarak teker teker çıkarmalıyız.
Her çıkardığımız eleman için kuyruğa ekleme fonksiyonunu çağırırız. Tabi kuyruğa ekleme fonksiyonumuz da verileri hep kuyruğun arkasından ekleyerek çalışır.
Bu şekilde verileri aktarabiliriz.

Kodunu paylaşacak olursak

Not : .c uzantısı ile derlerken hata alırsanız .cpp uzantısını deneyin.

Linux Çekirdeği Kernel’in Güncellenmesi

Merhaba arkadaşlar..

Bugün size aynı zamanda Sistem Programlama ödevim olan Linux Çekirdeği Kernel’i nasıl güncelleyeceğimizi anlatacağım.

İlk olarak hiçbir şey yapmadan önce Kernel’in versiyonunu öğreniyoruz. Kernel’in versiyonunu öğrenmek için Linux komut satırı Terminal’e uname –r komutunu yazıyoruz.

Bakalım..

1-güncellemeden once versiyon

Yukarıdaki ekran çıktısında görüldüğü üzere Kernel versiyonunun 3.13.0-37-generic olduğunu görüyoruz. Tabi bu sizde farklı olabilir.

Kernel versiyonumu öğrendikten sonra https://www.kernel.org/ adresine gidip Kernel’in en son stabil versiyonunu indiriyoruz. Ben 4.2.3 olanı indirdim. Dosyamız tar.xz olarak indirildi. Bunu arşivden çıkartmamız gerekiyor. Sabit diskimde Linux’e ayrılan yeteri kadar yer olmadığı için işlemlerimi harici diskim üzerinden yapacağım.

Harici disk üzerinden yaptığım için daha önceki denemelerimde bazı hatalarla karşılaşmıştım. Dosya izinlerinde sorunlar çıkabiliyor ve komutlar gerçekleştirilemiyordu. Daha sonra hatanın, harici diskimin nfts dosya sistemine sahip olduğundan kaynaklandığını farkettim. Çözüm olarak harici diskimde 20 GB’lik bir ex4 sürücüsü oluşturdum. Tabi geri kalanı ntfs. Bizim ntfs ile bir işimiz yok.

Sıra geldi arşivdeki dosyaları çıkartmaya..

Dosyaları çıkartmadan önce yapacağımız işlemlerde bir sorun çıkmaması için sistemden root yetkilerini alıyoruz. Root yetkilerini almak için sudo –s komutunu terminale girmemiz gerekiyor.

2-root yetkisi alma

Artık sistem yetkilerini almış bulunmaktayız.

İlk önce indirilen dosyayı harici diskimde oluşturduğum sürücüye kopyalıyorum.

3-arsivi hariciye kopyalama

Arşivin bulunduğu dizine giriyoruz.

4-arsivin bulundugu dizine girme

Şimdi dosyaları çıkarıyoruz. Ben harici diskimde oluşturduğum ex4 bölümüne çıkarıyorum. Siz farklı bir yere çıkartabilirsiniz. Önemli olan çıkarttığınız yerin dosya sistemi ex4 olmasıdır.

Dosyaları çıkarmak için tar –xJvf komutunu kullanıyoruz. -xJvf den sonra dosya adını yazıyoruz.

5-dosyalari arsivden cikartma

6-dosyalar arsivden cikartildi

Yukarıdaki resimlerden görüldüğü üzere dosyalarımızı arşivden çıkarttık.
Şimdi sıra geldi ana işlemlere başlamaya..
Çıkarttığımız dosyanın içine giriyoruz.

7-cikartilan dosyanin icine girme

İlk olarak make mrproper komutu ile eski ayarları temizliyoruz.

8-make mrproper

Daha sonra make menuconfig ile yüklenecek olan Kernel’in konfigürasyon ara yüzüne giriyoruz. İsterseniz bu adımı geçebilirsiniz. Görmeniz açısından anlatıyorum. Bu arayüzden kurulmasını istemediğiniz sürücüleri kaldırabilirsiniz.

9-make menuconfig

10-menu config

Exit diyoruz.

11-menuconfig den cikma

Evet dedikten sonra çıkıyoruz.

Daha sonra make clean komutu ile fazlalıkları temizliyoruz.

12-make clean

Şimdiki adımda make bzImage komutunu yazıp, çekirdeğimizi derlemeye başlıyoruz. Bende yaklaşık 20 dakika sürdü. Bilgisayarınızın performansına göre değişebilir.

13-make bzImage

Çekirdeğimiz derlenirken..

14-çekirdek derlenirken(bzImage)

Ve çekirdek derlememiz bitti.

15-çekirdek derlemesi bitti

Çekirdeğimizi derledikten sonra işin en uzun kısmı olan modül derlemesine geçiyoruz. Bende yaklaşık 2.5 saat sürdü (tüm sürücülerle beraber).

Modül derlemesini başlatmak için terminale make modules komutunu yazıyoruz.

16-make modules

Modüller derlenirken..

17-modul derlenirken

Uzun bir süre ardından modül derlememiz bitmiş oldu.

18-modül derlemesi bitti

Modül derlenmesi bittikten sonra çekirdek modüllerimizi modül kütüphanesine taşıyoruz. Bu işlemi make modules_install komutu ile yapıyoruz.

19-make modules_install

Taşıma işlemi gerçekleşirken..

20-make modules_install gerceklesirken

Taşıma işlemimiz sona erdi.

21-make modules_install bitti

Şimdi modüllerin ve sistemimizin düzgün çalışmasını sağlayacağız. Bunun için terminale mkinitramfs 4.2.3 -o/boot/initrd.img-4.2.3-generic komutunu giriyoruz. Komutun içindeki numaralı kısımlar ilk başta indirdiğimiz Kernel’in versiyonudur. Siz de indirdiğiniz versiyona göre komutu düzenleyebilirsiniz.

22-mkinitramfs

Daha sonra derlediğimiz çekirdeği boot dizinine kopyalıyoruz. Terminale cp /usr/src/linux-4.2.3/arch/x86_64/boot/bzImage /boot/vmlinuz-4.2.3-generic komutunu giriyoruz.

23-boot dizinine kopyalama

Kopyalama işlemimiz tamamlandı. Şimdi System.map dosyasını boot dizinine kopyalıyoruz.

24-system_map kopyalama

Sembolik bir bağ oluşturmamız gerekiyor bunun için terminale ln -s /boot/System.map-KERNEL_VERSION/boot/System.map komutunu giriyoruz.

25-sembolik bag

Neredeyse tüm işlemlerimizi tamamladık. Artık grub ayarlarını yapacağız. Güncellenen Kernel’in grub ekranında çıkmasını sağlamalıyız.

Grub dosyasını açmamız gerekiyor bunun için terminale sudo gedit /boot/grub/grub.cfg komutunu giriyoruz.

26-grub cfg acma

Açılan grub dosyasını düzenlemeden önce yeni bir terminal açıyoruz ve sudo blkid komutunu yazıyoruz.

27-sudo blkid

Karşımıza aşağıdaki resimdeki gibi bir çıktı gelmektedir.

28-UUID degeri

Buradan UUID değerimizi alacağız, peki hangisini ? Bu sorunun yanıtı; güncellenen Kernel’i hangi disk bölümünde çalıştıracağınızdır. Ben Linux Mint’in bulunduğu yerde çalıştıracağım. Bunun için şekilde seçili olan değeri bir yere kopyalıyorum. Bu değeri grub dosyamızda kullanacağız.

Grub dosyamıza dönüyoruz tekrar ### BEGIN /etc/grub.d/10_linux ### satırının altına aşağıdaki metni ekliyoruz.

Önceden aldığımız UUID değerini bu metinde root=UUID= kısımlarına kopyalıyoruz ve dosyayı kaydedip, kapatıyoruz.

Güncellenen Kernel’i gruba ekledik. Artık başlangıçta grubda gözükmesi için grub güncellemesi yapmamız gerekiyor. Bunun için terminale sudo update-grub2 komutunu yazıyoruz.

30-grub güncelleme

31-grub güncellendi

Artık grubu güncellemiş olduk. Sistemimizi yeniden başlatıyoruz ve grub ekranından yeni Kernel’imizi seçiyoruz.

Sistem açıldıktan sonra en başta yaptığımız gibi uname –r komutunu terminale giriyoruz ve yeni Kernel versiyonumuzu öğreniyoruz.

32-linux guncellendi

 

Yararlanılan kaynaklar

https://forum.ubuntu-tr.net/index.php?topic=18598.0
http://kod5.org/linux-cekirdegi-kerneli-nasil-derlenir/

Yığıt Yapısı

Merhaba arkadaşlar.. Bugün size önemli veri yapılarından biri olan yığıt yapısı hakkında bilgi vereceğim.Bazı kaynaklarda yığın diye geçebilir.

Bilgisayar alanında en kullanışlı yapılardan biri yığıt veri yapısıdır. Yığıt veri yapısı programlamada çok önemli bir yere sahiptir.

Yığın yapısı temel olarak sondan erişimlidir. Yığın yapısına veriler her zaman sondan eklenir ve sondan çıkarılır. Yığın yapısında LIFO(Last In First Out) mantığı işlemektedir. Yani son giren eleman her zaman ilk çıkar.

Üniversitede veri yapıları dersi aldıysanız mutlaka bu konuya aşinasınızdır. Yığın yapısının nerelerde bahsetmek istiyorum. Yazılım uygulamalarında Undo(Geri Al) işlemleri yığıt veri yapısı sayesinde kolayca gerçeklenebilir. En son yaptığımız işlemi geri almamız tam olarak yığıt kullanımını anlatmaktadır. Tarayıcılarda Back butonu ile önceki sayfaya dönme işlemi yığıt veri yapısı ile yapılmaktadır. Yüksek seviyeli bir dilde yazılmış matematiksel ifadelerin makine kodunda işlenmesinde yığıt veri yapısı kullanılmaktadır.

Son olarak bir yığıt yapısına eleman eklemenin C/C++ kodunu paylaşacağım.

Not : .c uzantısı ile derlerken hata alırsanız .cpp uzantısını deneyin.

Trigger Kullanımı

Merhaba arkadaşlar 🙂 Bugün çoğu veri tabanı sistemlerinde kullanılan Triggerlar hakkında bilgi vereceğim.

Triggerların Türkçesi tetikleyici demektir. Yani akla ilk olarak bir şey sonucunda etkilenen manası gelmektedir. Aslında tam olarak da Triggerlar bunu sağlar.

Triggerları veri tabanlarımızda kullanmamızın ana sebebi bir yerde bir değişiklik olduğunda buna paralel olarak başka bir yerde de değişikliğin sağlanmasıdır. Mesela bir veri tabanımız var ve içinde iki tane tablo olduğunu varsayalım ve X adlı tablomuzda değişiklik yapmak istiyoruz. Bu ekleme olabilir, silme olabilir ya da güncelleme olabilir. Eğer buna bağlı olarak Y tablomuzda da değişiklik olmasını istiyorsak Triggerları kullanırız. Bu bize dinamik bir değişiklik kazandırır. Yani bir tablonun içeriğini değiştirdikten sonra başka bir tablonun içeriğini değiştirmemize gerek kalmaz bu otomatik olarak gerçekleşir.

Triggerları, programlama dillerindeki şart cümleciklerine de benzetebilirsiniz.Yani şartın sağlanması gerekir şart sağlanıyorsa eğer Trigger çalışır.

Triggerlar Insert, Delete ve Update işlemleri üzerinde çalışırlar.

Veri tabanımızda bir Trigger yaratmak için aşağıdaki yapıyı kullanırız.

PL/SQL Nedir.. Neden Kullanılır..

Merhaba arkadaşlar.. Bugün size üzerinde çalıştığım PL/SQL teknolojisini anlatmaya çalışacağım.
Belki çoğunuz bu teknoloji hakkında yeterli bilgiye sahip değildir hatta ismini duymamış olanlar bile vardır. Daha çok bu teknolojinin nedir neden kullanılır ve nerelerde rol oynar bunun üzerinde duracağım.

1-PL/SQL Nedir, Neden Kullanılır?
PL/SQL yapısal dillerin SQL’e eklenmesi sonucu oluşan Oracle’a has bir dildir. PL/SQL kullanarak her türlü SQL cümleciği yazabilirsiniz. Dinamik SQL ifadeleri oluşturup, çalıştırabilirsiniz.En önemliği özelliği de PL/SQL uygulamaları veri tabanı kısmında çalışırlar. Böylece sorguların istemciden sunucuya ya da tekrar sunucudan istemciye gitmesine gerek yoktur. Yani ağ trafiği de azalmış olur.

2-PL/SQL Yapısal Özellikler
PL/SQL, SQL cümlelerine blok yapılarının, şart cümlelerinin, döngülerin vs. diğer özelliklerin eklenmesiyle oluşmuş bir dildir. En temel yapı birimi bloktur. Bir veya birden fazla bloktan oluşabilirler. Akış kontrolü sayesinde yapısal dillere ait olan şart cümleleri ve döngüler PL/SQL bloklarında kullanılabilir. Böylece yazılan programlar çok etkin ve hızlı hale gelmektedir. Eğer bu özellik olmasaydı SQL cümlelerini ayrı ayrı yazmak ve çalıştırmak gerekecekti.Bu da performansı azaltan etkenlerden bir tanesidir.

3-Blok Yapısı
Birbirleriyle ilişkili ifadelerin mantıksal bölümlere ayrılması demektir. Değişken tanımlamaları ve hata kontrolleri de her blok içerisinde yapılabilir. PL/SQL blok yapısı üç bölümden oluşur.Bunlar;

  • Bildirim Deyimleri
  • Program Komutları (Zorunlu!)
  • Aykırı Durumlar (Exception ifadeleri)

Bu üç bölümden sadece ikincisi zorunludur. Klasik bir PL/SQL blok yapısı şu şekildedir.

Şimdi de bu ifadede geçen komutları kısaca tanıyalım.

  • DECLARE : Blok içerisinde kullanılan değişkenlerin tanımlandığı bölümdür.
  • BEGIN : Bloğun başlangıcını belirten referans isimdir
  • EXCEPTION : Aykırı durumların başlangıcını belirten rezerve isimdir. Hata durumlarında neler yapılacağını kontrol eder.
  • END : Bloğun sonunu belirten referans isimdir.

Not:Exception kısmı nesneye yönelik programlama dillerindeki try/catch’e çok benzer. Bir hata olduğunda ne yapacağını belirtir.

Örnek bir blok yapısı yapalım.