Kategoriler
Anlatım Bilgisayar Bilimleri

Temelleri Abaküse Dayanan Bilim/Meslek Dalı

Bilgisayarlar günümüzde gencinden yaşlısına kadar herkesin hayatına girmiş ve dünyayı tabiri caizse köy haline getirmiş olan elektronik alettir. Onsuz iş yapmanın neredeyse mümkün olmadığı bu şeyin içini gerçekten biliyor veya öğrenmek istiyor musunuz? Peki Bilgisayar Mühendisliği bölümü okunduktan sonra neler yapılır? Çalışmak mı, akademisyenlik mi? Soruların cevabını bu yazıda bulabilirsiniz.

abacus
Babillilerin buluşu olan Abaküs, bilgisayarların atası olarak gösterilir.

Bilgisayar Mühendisliği

Bilgisayar Mühendisliği en genelde yazılım ve donanım ile ilgilenir. Yazılım, bilgisayarın anladığı dildir yani soyuttur. Donanım, bilgisayarı bilgisayar yapan fiziksel parçalardır örneğin sabit disk, hafıza, işlemci vb gibi. Bu iki ana bileşen olmadan bilgisayar olmaz.  Bunlara ek olarak, Bilgisayar Mühendisliği ile Bilgisayar Bilimi birbirine karıştırılmamalıdır. Bilgisayar Bilimi hesaplanabilme kuramı, algoritma analizi, kriptografi gibi dallardan oluşur. Bu alt bilim dalları soyuttur ve matematikle yakından alakalıdır. Bilgisayar Mühendisleri bu bilim dallarını bilgisayara uygularlar. Üniversite alınan eğitim her iki bilim dalını da kapsar. Bu bölümden mezun olduktan sonra işe girerseniz, Bilgisayar Mühendisliği yaparsınız. Eğer akademik ortamda bu bilimin gelişmesine katkıda bulunursanız Bilgisayar Bilimi ile uğraşmış olursunuz.

Yazılım, içerisinde, emirleri okuyup yerine getirme kabiliyeti olan her türlü elektronik veya elektromekanik alete istediğimiz şeyi yaptırmamızı sağlayan emir (instruction) yada emirlerin topluluğudur. Bilgisayarlar yazılım içinde yer alan kodları okur ve verilen emirleri yerine getirirler. Örneğin, bir robotu yürütmek veya hesaplanması vakit alan bir matematiksel işlemi hesaplatmaktır.

Donanım, fiziksel olarak bilgisayarı oluşturan, hesaplama yapabilen (işlemci), bilgileri tutabilen (hafıza veya sabit disk) ve bir takım başka şeyleri yapabilen (veri iletimi gibi) cihazlardır. Cd-Dvd sürücü, soğutucu, klavye, monitör, klavye, sabit disk, hafıza, ekran kartı, tv kartı vb şeklinde sıralanabilir.

Bilim olarak ele aldığımızda, bilgisayarın temeli abaküse dayanır. Çünkü bilgisayarın temelinde hesaplama vardır. Günümüz bilgisayarlara benzer bilgisayarlar ilk olarak II. Dünya Savaşı sırasında kullanılmıştır. Sonraki yıllarda hızla gelişmiş ve günümüzdeki konuma gelmiştir.

Eniac
ENIAC – Elektronik veri işleme özelliği olan ilk bilgisayardır.

Bilgisayar Bilmek Neden Önemli?

Bildiğiniz üzere, bilgisayarlar solunum cihazlarından muhasebeye, oyun konsollarından  silah sanayisine kadar her alanda ve her sektörde kullanılıyor. İnsanların işini kolaylaştırdığı için kullanımı hızla yayılmış ve hala yayılmakta. Bu nedenle çok farklı bir alanda eğitim almış olsanız dahi bilgisayar bilmek işe alım süreçlerinde önemli. En basit işlerde bile ofis yazılımlarını kullanabiliyor olmanız beklenir. Bunun yanında sadece iş hayatı için değil kendi kişisel gelişimizi için, hızla gelişen dünyaya ayak uydurmanız için gerekli, olmazsa olmazlardan.

Bilgisayar Mühendisliğinde İş ve Akademisyenlik

Günümüzde en gelişmiş ülkelerin bile birincil sorunlarının başında geliyor işsizlik. Peki Türkiye ‘de Bilgisayar Mühendisliği alanında bu durum böyle midir? Eğer kendinizi yeterince eğitmemişseniz ve mezun olduğunuz halde hala kafanızda hangi alana doğru yöneleceğiniz konusunda endişeler varsa iş bulmakta zorlanabilirsiniz zor. Fakat üniversitenin üçüncü, dördüncü yıllarında gelecek hedeflerinizi belirlemiş, o alanda çalışmalar yapmış, kendinizi eğitmişseniz iş bulmanız çok kolay.

İş dünyasında, başınızdaki kişinin sizden istediği şey verilen işi en iyi şekilde yapmanız. İşe alım süreçlerinde, yapılan mülakatlarda, aslında sizin  yaptığınız şey karşı tarafa ne kadar “Ben bu işi iyi yapabilirim” ‘i gösterdiğinizdir. Eğer karşı tarafı o işi iyi yapabildiğinize ikna ederseniz işe alınırsınız. Mülakatlarda sorulan soruların başında gelecekte ne yapmak istediğiniz olacaktır. Bu tip sorulara iyi cevap vermeli bilginizi göstermelisiniz.

Türkiye’de bilgisayar mühendislerinin yaptığı işler genel olarak yazılım geliştirme, veritabanı yönetimi, ağ yönetimi, bilgi güvenliği olarak ayrılabilir. Bunların dışında bilgisayar mühendislerinin çalıştıkları başka alanlar da vardır. Bunlara ek olarak, bir şirkette işe başlamak yerine kendi işinizi kurabilir ve patron olabilirsiniz. Ya da freelance olarak çalışabilirsiniz. Freelance olarak çalışma son zamanlarda artan bir çalışma yöntemi olmaya başladı. Evinizde oturduğunuz yerden aldığınız işi halledip ilgililere gönderebilirsiniz. Fakat bunun için çevrenizin geniş olması gerekir.

Türkiye ‘de ar-ge anlamında mühendislik bilginizi kullandığınız TUBITAK veya askeriye gibi sınırlı sayıda yer bulunuyor. O nedenle çoğu kişi yurtdışına çıkmayı hedefliyor. Beyin göçü yaşanıyor. Ar-ge olarak yapılan çalışmalar genelde üniversitelerde oluyor. Yurt dışına çıkma imkanı olmayanlar akademik hayata atılmayı hedefliyor.

İş
Saatlerce bilgisayar başında oturmaktan sıkılır mısınız?

Akademik anlamda Bilgisayar Mühendisliği ve Bilimi alanında çalışmak istiyorsanız elbette ki yapacağınız şey üniversitede kalmaktır. Türkiye’de genellikle hedeflenen şey yüksek lisansı yapıp doktora için yurt dışına çıkmaktır. Sonrasında Türkiye ‘ye geri dönüp burada çalışmalara devam edilir. Akademisyenler için yurt dışında doktora yapmanın önemi büyüktür. Üniversiteye alımlarda yurt dışı eğitimi almış olmanın verdiği avantajları azımsamamak gerekir.

Geleceğiniz için seçim yaparken kendinize sormanız gereken bazı sorular vardır. Bilgisayar alanında ilginizi çeken alan hangisidir? Hangi alanda çalışırken mutlu oluyor, zevk alıyorsunuz? Patron mu olmak istiyorsunuz yoksa yönetici olmakta yeterli mi? Çalışan bir arkadaşınız siz akademisyen olarak çalışırken sizden fazla para kazanıyorsa bu sizin için sorun olur mu? Bir problem üzerinde uzun süre boyunca düşünmek sizi sıkar mı?

Bu alanda kariyer yapmak isteyen arkadaşlara tavsiyem; öncelikli olarak kendinizi iyi yetiştirin. Üniversitede ekstra şeyler yapmak için çok vakit bulacaksınız. Eğlenceden fedakarlık yapıp araştırmalar yapın. Bu neymiş, şu ne demekmiş, bu nasıl olur gibi sürekli bir şeyleri kendinize sorun ve cevaplarını arayın. Ufak ufak projeler geliştirin. Üniversite bittiğinde birilerine gösterecek bir kaç projeniz olsun. Kendinize yukarıdaki gibi soruları sorun ve cevaplar ışında kariyer hedeflerinizi belirleyin. Çalışmak istediğiniz alan nedir? İş yerinde çalışmak istiyorsanız özellikle istediğiniz bir şirket var mı? Eğer varsa işe alma koşulları neler? Akademisyenlik düşünüyorsanız hangi üniversite? Yurt dışı seçenekleriniz arasında mı? İş kurmak size daha mı uygun? Her şeyi ayrıntılı düşünün. Hedefleriniz net olsun. Muallakta kalmayın yoksa düşünürken vakit kaybedersiniz veya elinizdeki seçeneklerin hepsi olumlu/olumsuz görünür ve seçim yapmanız zorlaşır. Kendinize güvenin ve vazgeçmeyin. Her zaman bir projeyi mükemmel yapamayabilirsiniz. Sorunlarla karşılaşabilirsiniz. Sizi mühendis yapacak olan sorunlara çözüm bulmanızdır zaten. Son ve en önemli tavsiyem; kariyer seçiminiz ne olursa olsun yaptığınız iş sevdiğiniz bir şey olsun.

Kategoriler
Anlatım Bilgisayar Bilimleri

Dizin Listeleme

Allah ‘ın selamı, rahmeti, bereketi, ihsanı, ikramı, affı, mağfireti, rızası üzerinize olsun,

Bugün kısaca dizin listelemeden bahsedeceğim. Diyelim ki kişisel websitenizde dizinlere erişim kapalı. Yani bir klasörün içini göremiyorsunuz/listeleyemiyorsunuz. www.benimsitem.com/ekdosyalar dizinine ulaşmak istiyorsunuz fakat hata alıyorsunuz, ulaşamıyorsunuz. Apache sunucularda bunu yapmanın kolay bir yolu var.

Belki daha önce duymuşsunuzdur, .htaccess diye bir dosya var. Bu dosya bir ayar dosyası. Hangi dizine koyarsanız o dizine ait erişim vb diğer kuralları belirler.

Htaccess’in kendine has kodlama sistemi var. Dizin içindekileri listelemek için öncelikli olarak yapmanız gereken şey .htaccess adında bir dosya oluşturmak ve içine;

Options +Indexes
IndexOptions +FancyIndexing

Indexes dizin içindeki şeyleri indekslemek için kullanılan koddur. Tahmin ettiğiniz üzere + işareti seçeneği etkinleştirmeye yarıyor. Alternatif işaret olan – işareti de etkisizleştirmek için kullanılıyor. Bir sonraki satırda da nasıl bir listeleme yapacağımızı belirliyoruz. FancyIndexing güzel ve ayrıntılı listeleme seçeneğidir. Başka seçenekler de var ama ben burada bahsetmedim. Bu iki kodu .htaccess adlı metin belgesinin içine yazıp kaydettikten sonra listeme yapmak istediğiniz dizinin içine atın.

Eğer herşeyi doğru şekilde yaptıysanız karşınıza çıkacak sayfa şu tip bir şey olmalı (:

Dizin Listeleme
İşlemleri doğru yaptıysanız dizin görünümü bu şekilde olacaktır

Allah ‘a emanet olunuz…

Kategoriler
Anlatım Bilgisayar Bilimleri

Veritabanı Aynalama/Yansıtma (Database Mirroring)

Veritabanı aynalama da sadece bir sunucu müşterilere hizmet verir. Buna esas, asıl ya da ana sunucu (principal server) denir. Ben bana daha anlaşılır geldiği için birincil sunucu tabirini kullandım. Sistemin iki sunucu ile çalıştığını söylemiştik. İşte diğer sunucu beklemededir ve sunucunun bu durumu (beklemede kalma) aynalama oturumuna (mirroring session) göre ve ayarlara göre değişir. Bu sunucuya ayna sunucu (mirror server) denir. Fakat ben yine daha iyi anlaşılması açısından ikincil sunucu olarak bahsettim. Veritabanı aynalama oturumu (iki veritabanı arasındaki bağlantı) senkronize edildiğinde (yani iki veritabanı arasında bilgilerin eşitlenmesi işlemi gerçekleştirildiğinde) veritabanı aynalama olayı gerçekleşir ve hazırda bekleyen ve afet anında devreye girecek olan ikincil veritabanını oluşturur. Veri eşitleme oturumu senkronize olmazsa, veritabanı veri kaybı da olsa, beklemede durur. Veritabanı aynalamada birincil sunucuda gerçekleşen her ekleme, çıkartma ve güncelleme işlemi ikincil sunucu üzerinde de olabildiğince hızlı bir şekilde gerçekleşir. Yeniden gerçekleştirme işlemi birincil sunucunun ikincil sunucuya işlem kayıtlarını (transaction logs) göndermesiyle başlar. İkincil veritabanında bu işlemleri ikincil ve beklemede olan veritabanı üzerinde uygular. Çoğaltmada (Replication) işlemler mantıksal düzeyde gerçekleşirken veritabanı aynalamada işlemler fiziksel düzeyde gerçekleşir. Çünkü direk olarak veriler ayrı bir diske yeniden yazılır. Birincil ve ikincil sunucular aynalama oturumu esnasında birbirleriyle iletişim içerisindedirler ve karşılıklı olarak çalışırlar. Her iki eş (partner) de aynalama oturumu esnasında birbirini tamamlayacak şekilde çalışır. Bu roller birincil ve ikincil rolleridir. Her hangi bir zamanda eşlerden biri birincil rolü gerçekleştirirken diğer eş ikincil rolü gerçekleştirir. Her eş kendi rolünün sahibidir. Birincil rolü üstlenen eş birincil sunucu olarak adlandırılır. Birincil sunucu üzerindeki veritabanına da birincil veritabanı denir. Diğer sunucu ise bu duruma bağlı olarak ikincil sunucu özelliğini gösterir ve onun üzerindeki veritabanı da ikincil ya da ayna veritabanıdır.

Veritabanı aynalamanın bir faydası veriyi korumaktır. Veri eskiden bir veritabanı üzerinde yer alırken şimdi iki ayrı sunucu üzerinde aynı bilgileri içeren iki veritabanı bulunur. Sunucunun birinde bir hata olduğunda ikinci sistem devreye girerek kullanıcıların çalışmasına devam edebilir. Yani veri yedek bir sistemde tutularak korunmuş olur.

Bunun yanı sıra veritabanı aynalama tam anlamıyla ya da neredeyse tam olarak veri yedeği alınır. Bu yedek yüksek güvenlik veya yüksek performans moduna göre değişiklik gösterir. Yüksek güvenlik modu senkronize olarak çalışır. Yüksek performans modu zamandan kazanmak için asenkron olarak çalışır. Çalışma mantıkları aşağıda açıklanacaktır.

Yüksek güvenlik modunda birincil sunucu aktif kayıtları ikincil sunucuya gönderir. İkincil sunucu bu kayıtları alıp ikincil veritabanına yazmadan önce diske yazar ve sonra birincil veritabanına “Ben kayıtları diske yazdım bir sonraki işlemi yapabilirsin” anlamına gelen bir mesaj gönderir.  Sonrada diske yazdığı kayıtları ikincil veritabanına uygular.

Yüksek performans modunda ise birincil sunucu ikincil sunucuya kayıtları gönderip ve ikincil sunucunun kayıtları diske yazdığı onayını beklemeden işlemleri gerçekleştirmeye devam etmesidir. Yani yüksek güvenlik modunda ki ikincil diskin birincil diske olan geribildirimi beklenmez. Bu sayede geribildirimi bekleme süresi ortadan kalktığı için birincil sunucu işlemleri hızlı bir şekilde gerçekleştirir.

Veritabanı aynalamanın bir diğer faydası veritabanına erişimin sürekli kılınmasını sağlamasıdır. Daha öncede bahsettiğimiz gibi birincil sunucu çalışmayı durdursa bile yedek sunucu üzerinden veritabanına erişim mümkün olduğu için sistem çalışmaya devam eder. Bu nedenle afet durumlarında zor durumda kalmamak için tercih edilen yöntemlerdir. Yüksek güvenlik modunda bir afet olması durumunda yedekte beklemede olan veritabanı çevrimiçi hale geçer. Burada çok az bir veri kaybı vardır. Diğer modlarda veritabanı yöneticisi alternatif veritabanını ayağa kaldırır.

Veritabanı aynalama sisteminin son faydası ise güncelleştirmeler sırasında ürün veritabanının (production database) erişimini arttırır. Aynalamanın kullanıldığı sistemlerde veritabanı çevrimdışı süresini azaltmak için bir sistem üzerinde SQL Server güncelleştirmeleri yapılırken yedek sistem çalışır. Daha sonra yedek sistemin güncelleştirilmesi yapılarak hem veritabanı çevrimiçi tutulur hem de sistemler güncellenmiş olur.

Kategoriler
Anlatım Bilgisayar Bilimleri Linux

Linux Mount İşlemi

Bizim genel olarak dosya sisteminden anladığımız olay işte efendime söyleyeyim resim, müzik, klasörler işte atıyorum film formatları, ıdı ve bıdıdır. Evet aslında bir bakıma öyle çünkü dosya sistemleri üzerlerinde duran dosya formatlarını (jpeg, gif, mp4, mp3, avi, xls, ppt, docx vs vs vs..) anlarlar. Yalnız kendi beyinleri yok bunların. Yani gidipte sizin usb belleğiniz aa benim içinde mp3 var çalıp oynayayım demez. İşletim sistemleri bu tip şeyleri yapar. Buna bağlı olarakta her işletim sisteminin anladığı dosya sistemi ve dosya formatı vardır. En en en açık ifadeyle şöyle bir toparlamak gerekirse, dosya sistemi depolama ünitelerini kullanmaya (çünkü ham olarak bir diski kullanamazsınız, üzerinde bir dosya sistemi olmak zorundadır) yarar. Dosya formatları da dosyaları kullanmaya yarar. Hayalinizde nasıl canlandırsanız güzel olur diye düşünüyorm .. mm bulamadım.. tmm buldum ama çok uymamış olabilir, idare edin.. Düşünün ki bir arsa var. Fakat sadece bir arazi bu (ham depolama ünitesi, üzerinde dosya sistemi yok) üzerinde ev vs yok. Biz o evi kullanmamız için odalar yapmalıyız (dizinler yada dosyaların bulunduğu konumlar gibi), yerleri döşemeliyiz, işte mesela elektrik hattı çekilmeli sonra fayans vs gibi alt yapısal şeyleri yapmalıyız. İşte bunlar dosya sistemidir. Bizim kullandığımız eşyalarsa dosya formatlarıdır. Ne gibi? Bardak ve sürahiyi düşünün ikisininde içine sıvı şeyler konur. Bu bir yazı editörü gibi yani bir txt yada docx gibi.. Yani dosya formatı gibi. İkiside sıvıları depolar, aynı txt ve docx in yazıları depoladığı gibi.. Umarım daha açık olmuştur. Evet kısa bir dosya sistemleri açıklamasından sonra gelelim dosya sistemlerini monte etme (mount) işlemine..


İlk olarak anlamamız gereken şey şu; elimizde bir dosya sistemi var (yani bir usb bellek yada harici disk yada işte bilmiyorum harici cdrom bile olabilir.. çünkü yukarıda da dediğimiz gibi işletim sistemlerinin alması için bir dosya sistemi bunlar üzerinde olmalı. Bu sebeple depolama ünitelerine dosya sistemi demek mümkündür.. garip ama deniyor işte..) neyse işte elimizdeki bu dosya sistemini bir yere monte etmemiz gerekiyor ki sistem görsün. Bu sebeple bizde ubuntuda (kendileri bir linux dağıtımı, bilmeyenler için) diski işletim sistemine monte etmek için bir yer belirtmemiz gerekiyor. Tıpkı otopark görevlisi gibi. Abi sen buraya geç hop sen üst kata, hey sen buraya gel şuraya gir gibi.. Hani oluyor ya düğünlerde abi gel şöyle yanaş diyorlar vs onlar gibiyiz yani. Biz söylüyoruz sen gel bakalım buraya seni sistemde şu klasörün altına monte ediyorum, sen burada dur diyoruz. Tabi monte etmek için bir komuta ihtiyaç var. Bu komut “mount” komutudur. Montalama işleminde önemli olan bir husus, işletim sistemi sizin dediğinizi yani sadican harici sürücüyü anlamaz. O deli tamam mı, Losttaki Sawyer gibi isim takıyor ona buna, bu yüzden sizin onun taktığı ismi öğrenmeniz gerek. Bunun için “dmesg” komutunu daha hiç bir şey yapmadan komut satırına yazmalısınız. Çıkan uzuuun yada kısa listede şöyle bir şeyler olmalı;

[ 8.168235] usb-storage: device scan complete
[ 8.168834] scsi 5:0:0:0: Direct-Access Seagate Portable 0130 PQ: 0 ANSI: 4
[ 8.169493] sd 5:0:0:0: Attached scsi generic sg2 type 0
[ 8.170135] sd 5:0:0:0: [sdb] 976773168 512-byte logical blocks: (500 GB/465 GiB)
[ 8.170784] sd 5:0:0:0: [sdb] Write Protect is off
[ 8.170794] sd 5:0:0:0: [sdb] Mode Sense: 2f 08 00 00
[ 8.170796] sd 5:0:0:0: [sdb] Assuming drive cache: write through
[ 8.172145] sd 5:0:0:0: [sdb] Assuming drive cache: write through
[ 8.172150] sdb: sdb1
[ 8.174037] sd 5:0:0:0: [sdb] Assuming drive cache: write through
[ 8.174042] sd 5:0:0:0: [sdb] Attached SCSI disk
[ 18.776423] udev: starting version 147

Burada önemli olan kısım kırmızyla yazılmış olan sdb:sdb1 kısmı. İşte bu sdb1 ismi işletim sisteminin o harici sürücüye taktığı isim. (Anladığınız üzere montalama işlemi için öncelikle harici zımbırtı her neyse onu bilgisayara takmanız gerekir.) komutu biliyoruz. Adını da öğrendik. Son olarak diskin nerede olduğunu ve nereye monte edeceğimizi bilmemiz gerekiyor. Nerede olduğu bizim elimizde değil. İşletim sisteminin tasarımından gelen bir şey diskin nerede olduğu. Bu ne demek? Takılan disk yada harici şey işletim sisteminde bir yerde duruyor. Ubuntuda ve genel olarak unix ve linux dağıtımlarında kök (root gösterim olarak / ) ana dizini içindeki dev dizinde olur. Biz nereye monte edeceksek o da ztn aklımızda. Burada işlemleri süper kullanıcı olarak yapacağız. Bu sebeple komut satırına sudo yazıp şifreyi yazarak süper kullanıcı oluyoruz. Şimdi artık montalamayı yapabiliriz. komut satırına;
dmesg // adının ne olduğunu bulmak için
mount /dev/(dmesgten öğrendiğimiz ad) /(monte etmek istediğimiz yerin adı)

En genelde taa süper kullanıcı olup, adının sdb1 olduğunu ve masaüstüne monte etmek istediğimizi varsayalım;
sudo
(şifre)
dmesg
mount /dev/sdb1 /home/sadican/Desktop

(İkinci yol)
dmesg
sudo mount /dev/sdb1 /home/sadican/Desktop
(süper kullanıcı şifresi)

Eğer monte ettiğimizi kaldırmak istiyorsak bu durumda komut olarak “umount” komutunu kullanırız.
sudo umount /home/sadican/Desktop

Hepsi bu kadar biraz uzun oldu ama umarım anlamışsınızdır..
Herkese iyi günler dilerim..
sadican
Kategoriler
Anlatım Bilgisayar Bilimleri

Indeksler (Veritabanı)

Indeksler iki kategoriye ayrılır. Bunlar kümelenmiş (clustered index) ve kümelenmemiş (non-clustered index) indekslerdir. SQL Serverda kümelenmiş indekslerde kayıtlar tablodaki bir kolona göre sıralanır. O kolonda yer alan bilgiler tekrar etmez. Yani isim kolonunu kümelenmiş indeks olarak tanımladığımız zaman o kolona iki tane Ali isimli kayıt giremeyiz. Eğer bir tabloda birincil indeks kısıtlaması (primary key constraint) veya özgün indeks kısıtlaması (unique key constraint) varsa bu kolonlardan biri kümelenmiş indeks olarak tanımlanabilir. Bununla birlikte bir tabloda doğası gereği sadece bir tane kümelenmiş indeks bulunur. Düşünelim ki, SQL Server aynı tabloya iki tane kümelenmiş indeks tanımlamaya izin verdi. Bizde önce isime daha sonra soyada göre kümelenmiş indeks tanımladık. SQL Server önce isime göre kayıtları sıralasın. Daha sonra soyada göre kayıtları sıralamaya çalıştığında bu sefer isim sırası karışır. Bu nedenle aynı tabloya birden fazla kümelenmiş indeks tanımlamak mümkün değildir. Kümelenmiş indeksler aralık sorgularında yüksek performansı gösterir. Bununda nedeni basittir. Kayıtlar sıralı olduğu için aralığın başını ve sonunu bulmak için çok zaman kaybedilmez. Örneğin para kolonu kümelenmiş indeksle tanımlı olsun ve biz sorgumuzda üç bin dolar ile yedi bin dolar arasında maaşı olanları elde etmek istiyoruz. Bu durumda ilk üç bin dolar kazanan kişiden en son yedi bin dolar kazanan kişiye kadar aşağı doğru kayıtlar kullanıcıya getirilir. Kullanım olarak bir tablo üzerinde başka indeksler tanımlanmadan önce kümelenmiş indeksi tanımlamakta fayda vardır. Bununla birlikte SQL Server kümelenmiş indeksi iki nedenden dolayı kullanır. Biri yukarıda da bahsettiğimiz gibi aralık sorgularıdır. Diğer ise arama sorgularında kullanılır. Kümelenmemiş indeksler doğrudan verilere erişemez. Yığın (heap) üzerözgüninden ya da kümelenmiş indeks üzerinden verilere erişebilir. Eğer yığın olarak tanımlanırsa (yani kümelenmiş indeks tablo üzerinde kullanılmıyorsa) her satır, satır numarasıyla (row id) tutulur. Satır numarası dosya numarası, satır numarası ve sayfa içindeki satır sayısından tutulur. Eğer kümelenmiş indeks varsa kümelenmiş indeks üzerinden çalışır.

Bir tablo üzerinde bir sütun bilgilerinin tekrarlanmamasını istiyorsak bunun için özgün indeks (unique index) kullanılır. Özgün indeks hem kümelenmiş hemde kümelenmemiş indeks ile birlikte kullanılabilir. Birincil kısıtlama (primary key) veya özgün kısıtlama (unique key) tanımladığı zaman özgün indeks otomatik olarak tanımlanmış olur. Bu oluşum yapılırken indeksin kümelenmiş olup olmayacağı belirtilmelidir. Kullanıcı bir seçenek belirtmezse birincil anahtar kısıtlaması (Primary Key Constraint) SQL Server’ca özgün indeks olarak özgün kısıtlamada (Unique Constraint) kümelenmemiş özgün indeks olarak belirlenir.

Bir tablo üzerinde indeks tanımlamak için T-SQL ifadesi kullanılabilir. Bu işlem aynı zamanda Microsoft SQL Server Management Studio kullanılarak grafik ekran üzerinden de yapılabilir. T-SQL olarak tanımlama yapmak için aşağıdaki SQL kodunu kullanmak yeterlidir.

CREATE index_tipi INDEX index_adı ON tablo_adı(sütun_adı)

İndeks tipinden ifade edilmek istenen şey indeksin kümelenmiş mi yoksa kümelenmemiş mi olduğunu belirtmek için kullanılır. UNIQUE, CLUSTERED yada NONCLUSTERED yazılabilir.

Daha ayrıntılı bir şekilde indeks oluşturmak için aşağıdaki kodları inceleyebilirsiniz.
(Books Onlinedan alıntıdır. Adres: http://msdn.microsoft.com/en-us/library/ms188783.aspx)

CREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name
    ON <object> (column_name [ ASC | DESC ] [ ,…n ] )
    [ WITH <backward_compatible_index_option> [ ,…n ] ]
    [ ON { filegroup_name | “default” } ]

<object> ::=
{
    [ database_name. [ owner_name ] . | owner_name. ]
    table_or_view_name
}

<backward_compatible_index_option> ::=
{
    PAD_INDEX
  | FILLFACTOR = fillfactor
  | SORT_IN_TEMPDB
  | IGNORE_DUP_KEY
  | STATISTICS_NORECOMPUTE
  | DROP_EXISTING
}

Kategoriler
Anlatım Bilgisayar Bilimleri

Linked Lists

LLler ucu bucağı olmayan arrayler gibidir fakat uygulamaları biraz karmaşıktır. LLler bir veri yapısı aracılığıyla tanımlanır ve veri yapısının içerisinde belli değişkenler tutulur. Bu değişkenlere ek olarak her bir itemı birbirine bağlamak için bir pointer tutulur. Bu sayede tüm itemlar birbirine bağlanarak bir liste yada bir array oluşturulur.

LLlerde ilk olarak yapmamız gereken şey bir data structure tanımlamaktır. Data structure ‘ın tanımı;

struct linkedList {

int studentID;

struct linkedList *next;

};

Burada struct linkedList diyerek linkedList adında veri yapısı tanımladık. Bu veri yapısının içerisinde öğrenci numaralarının tutulduğu bir değişken ve veri yapısının kendisinin bir pointerı var. Aslında daha fazla şey olabilir. Mesela char *studentName vb gibi.. daha bir çok değişkeni içeride tanımlamak mümkün ve normalde zaten bu kadar basit ya da sade olmaz. Genelde data structure içerisinde bir çok tipte değişken olur. Bu arada bu pointer da nereden çıktı demeyin. Bu linked list in oluşmasındaki temel öğelerden biridir. Burada pointer koymaktaki amaç ileride de daha iyi anlayacağınız gibi veri yapılarını bir birine bağlamak. Peki neden struct linkedList diyerek tanımladıkta int diyerek tanımlamadık derseniz şöyle bir açıklama sanıyorum mantıklı olur. Biz biliyoruz ki bir integer pointer tanımlarken int *degisken diyoruz. Yani int değişkenin türü. İşte aslında data yapılarıda bir değişken olduğundan ve biz de kendi oluşturduğumuz data structure için bir pointer oluşturmak istediğimizden next pointerının başına struct linkedList dedik. Ayrıca burada next in özel bir durumu yok dilersek subuti bile diyebilirdik yani yine mantıktan çıkartacağımız üzere eğer struct linkedList int gibi bir typesa o zmn *next de bir değişkendir. Bu açıklamalardan sonra gelelim bir sonraki adıma, bir sonraki adımda şunu yazacağız,

typedef struct linkedlist *list;

Bunu yazmakta ki amaç şu, biz biliyoruz ki typedefi kendi değişkenimizi oluşturmak için kullanırız. Fakat burada yeni bir type oluşturmuyoruz. Var olan typeın adını değiştiriyoruz. Ne gibi mesela typedef int ahmet dediğimizde ahmet artık int yerine kullanılabilen bir veri tipi oldu. ahmet numara=10; şeklinde bir kullanabiliriz. Biz yukarıda da söylediğim gibi biz az önce struct linkedList adında bir tip tanımladık. Bunu kullanırken nasıl ki int variable; diyorsak struct linkedList variable diyeceğiz ama bu, programı yazarken hem uzun hemde programı anlama açısından (başka bir kod yazıcısı için..) karmaşık bir şey. İşte bu uzun değişken tanımlamayı daha sade görünümlü ve anlaşılır yapabilmek için typedef komutunu kullandık. Artık struct linkedlist yerine sadece list yazsakta aynı şey olur veeee unutmuyoruz kii list artık bizim int gibi bir veri türümüz. Burada bir diğer ayrıntı yeni veri tipini *list olarak değiştirdik. Bunun nedeni şu; bildiğiniz gibi pointerlar memorydeki adresleri tutuyor. Burada memoryle direk ilişkili bir iş yapıyoruz (aslında herşey memoryle ilişkili bu söz biraz garip oldu ama anladınız sanıyorum anlatmak istediğimi) ve linked listin her elemanı memoryde bir yerde duruyor. Bu sebeple bizim onların adreslerini tutuyor olmamız gerekiyor. Tüm itemları birbirine bağlamak için ve her bir item bir pointer olarak tutulduğu için zaten bir next diye bir pointer tanımladık.

Şimdi sırada gerçek bir item oluşturma adımı var. Şimdi listenin en başını gösterecek olan head, o an nerede olduğumuzu gösteren bir head adında bir item oluşturuyoruz.

list head, save, temp;

Burada oluşturulan temp o an elimizde geçici olarak tutmak istediğimiz bir item için ve savei de daha başka işlerde kullanmak amacıyla tanımladık. Daha sonra ana programda head liste boş olduğu için NULLa eşitleyeceğiz. Bu eşitlik bize listenin sonuna geldiğimizi anlatacak. Bir item eklerken yada bir veriyi liste üzerinde arama yaparken listenin sonuna gelip gelmediğimizi işte bu NULL sayesinde anlayacağız.

Sıra listeyi doldurmaya geldi fakat buraya kadar olan şeyleri genel olarak toparlamak ve anlatılanları tek bir resimde görmek amacıyla bir kod olarak yazıyorum.

#include <stdio.h>
#include <stdlib.h>

//veri yapısı

struct linkedList {

int studentID;

struct linkedList *next;

};

//tanımlar

typedef struct linkedList *list;
list head, temp, save;

//ana program

int main(){
head = NULL;
system(“pause”);
return 0;
}

 Arkadaşlar kod tam anlamıyla çalışmayabilir, kafadan yazdım test etmedim. Umarım neyin nerede olduğuna dikkat etmişsinizdir. Neyi nerede tanımlıyoruz, nasıl yapıyoruz ıdı ve bıdı …

Gelelim item eklemeye, bunun için bir fonksiyon yazacağız. Fonksiyon içerisine sadece studentID için bir veri alacak çünkü diğer head vsler globalde tanımlı ana programda tanımlanmadığından onlarıda fonksiyona göndermeye gerek yok. Şimdiiiii o zaman fonksiyon şöyle olacak,

void insertBeginning (int data){

temp=(list)malloc(sizeof(struct linkedList));

temp -> studentID = data;

if(head==NULL){

head=temp;

head -> next = NULL;

}

else{

temp -> next = head;

head=temp;

}

}

Yukarıdaki fonksiyonda hali hazırda temp diye yukarıda tanımladığımız item için hafızada yer ayırdık. malloc önündeki (list) kısmı cast için gerekli çünkü değişken tipi list. Burada mantık şu, temp diye bir item var ve biz hafızada bir yer ayırıyoruz buna sonra bu item içindeki değişkeni listeye eklenmek istenen değişkene ekliyoruz. Bu sayede elimizde listeye eklenmek üzere hazırlanmış içinde kullanıcının listeye eklemek istediği bir item var. Bu olay bir paketleme işlemi gibi, satılacak mal bir pakete konuyor ve paket içinde şampuan ve bir açıklama zıbıdığı var atıyorum. Sonra bir bu küçük paketi daha sonra dağıtıma gönderilecek kolilere koyacağız. Koliyide mm neydi heh liste olarak düşünün.. Çaktınız mı köfteyi?? Kullanıcı datası parfüm oluyor ve biz onu item içerisine koyuyoruz. Item aslında paket, daha sonra o paketi de koli içine koyacağız. Evet az önce paket hazırlamayı anlattım sıra koliye yerleştirmekte. Burada bir itemı listeye yerleştirmenin farklı yolları var. Ben her geleni en başa koydum. Burada mantık şu; head eğer NULL sa bu liste miste ortada yok demektir. O zmn gelen paketi (temp) head paketine eşitle bu sayede elimizde yani kolide bir paket oldu. head -> next = NULL satırı da bir sonra ki item ekleme işleminde kullanılmak için yazılmış bir kod. Bu kodun tek amacı bu değil. İlk başta da söylediğim gibi NULL sayesinde listenin sonuna geldiğimizi anlıyoruz. Bu nedenle bu NULL un iki işlevi var. Farz edelim ki head NULL değil yani listede boş değil.. Bu durumda alternatif bir yolumuz daha olmalı, bu durum için şöyle bir yol izliyoruz; hani yukarıda temp diye bir paket yaptık ya o paketi listenin başına getiriyoruz. Bu da şöyle oluyor hani head en baştaydı ya, daha sonra heade bir item bağlıydı ve o itema başka bir item sonra onada başka bir tane sonra onada onada onada … öyle gidiyor. İşte düşün şimdi headle başlayan bir liste var, kafanda hayal et böyle ipe dizilmiş boncuklar gibi, sonra sen bir tane boncuğu alıp ipe geçiriyorsun ve temp -> next = head diyerek geçirdiğin boncuğun bir sonraki gösterge zıbıdığını heade bağlıyorsun. Bu durumda temp aslında senin yeni headin oluyor. ama bu olmaz o yüzden bir o head=temp diyerek headi başa almış oluyoruz. Burada eşitlemede kafanız karışmasın. Head göstermelik bir şey gibi böyle bir etiket o. Pointer olduğundan sen neye eşitlersen onun özelliklerini alır. Sen şimdi burada head=temp diyorsun ya hani temp baş olmuştu işte headde böylelikle yenilenen baş oluyor.

LLlerde ekleme bu şekilde fakat tüm işler bununla sınırlı değil bir veriyi arama silme vb işlemlerde mevcuttur. Ben onları burada anlatmayacağım çünkü o kadar zamanım yok ne yazık ki.. Eğer vakit bulursam on işlemlerin anlatımlarınıda buraya eklerim.

sadican